CMakeList.txt(3): 一個cmake實例

介紹一個比較實用的例子,即包含生成靜態庫又包含引入外部頭文件和連接庫的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目錄下。執行結果以下:

相關文章
相關標籤/搜索