介紹一個比較實用的例子,即包含生成靜態庫又包含引入外部頭文件和連接庫的cmake demo。ui
先按照工程規範創建工程目錄,並編寫代碼,如下面的工程目錄爲例進行解釋這個例子,工程的目錄結構爲:spa
1. 編寫CMakeLists.txtblog
因爲一個工程目錄中包含多個項目,其中在此項目中包含util項目和main項目,其中util項目是用以生成main程序須要的靜態庫,main是用以生成可執行文件。遞歸
在工程項目中的父目錄向有一個CMakeLists.txt是用以聲明定義工程須要的Cmake設置還定義了子目錄src,用以遞歸的調用src中的MakeLists.txt。編譯器
1) 工程目錄的CMakeLists.txt內容定義以下:編譯
PROJECT(HELLO) 定義工程的名稱變量
ADD_SUBDIRECTORY(src) 用以遞歸的調用src中的MakeLists.txtList
2)src裏面的CMakeLists.txt內容定義以下:搜索
ADD_SUBDIRECTORY(main) 用以遞歸的調用main中的MakeLists.txt
ADD_SUBDIRECTORY(util) 用以遞歸的調用util中的MakeLists.txt程序
3)util目錄裏面的CMakeLists.txt是用以定義生成util靜態庫的規則,其中內容以下:
SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib) 定義了庫生成的路徑,LIBRARY_OUTPUT_PATH是一個內部變量,存放庫生成路徑
SET(CMAKE_C_COMPILER g++) 定義編譯器
SET(SRC_LIST hello.c) 定義庫文件須要的源文件
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include) 定義非標準庫頭文件要搜索的路徑
ADD_LIBRARY(util STATIC ${SRC_LIST})
4)在main目錄中的CMakeLists.txt是用來定義可執行程序編譯和連接時所須要的一些命令或環境。內容以下:
SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin) 定義執行文件輸出路徑
SET(SRC_LIST main.cpp) 定義庫文件須要的源文件
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include) 定義非標準庫頭文件要搜索的路徑
LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib) 定義依賴靜態庫要搜索的路徑
ADD_EXECUTABLE(hello ${SRC_LIST}) 生成執行文件
TARGET_LINK_LIBRARIES(hello util) TARGET_LINK_LIBRARIES用以定義連接時須要的庫文件。
2.在工程目錄下建立build目錄,並採用out-of-source方式編譯項目。執行命令cmake ..,執行結果以下:
3)而後進行make
4)安裝
從新編輯工程目錄下的CMakeLists.txt。在CMakeLists.txt中添加以下命令:
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)
INSTALL(PROGRAMS run.sh DESTINATION bin)
INSTALL(PROGRAMS bin/hello DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)
這些命令表示在執行make install命令時,安裝程序會拷貝相應的文件、目錄或程序到指定的前綴開始的目錄中
cmake執行命令以下:cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..
這時將工程目錄安裝到~/data/cmake_demo目錄下。執行結果以下: