1. cmake_minimum_required(VERSION 2.8) 檢查cmake的版本,至少為2.8
2. project(helloworld) 工程名為helloworld
3. aux_source_directory(. SRC_LIST) 查找當前目錄下所有的源文件並保存到SRC_LIST變量中
4. include_directories(./include ./abc) 將./include和./abc加入包含目錄列表
5. link_directories(./lib) 將 ./lib加入編譯器鏈接階段的搜索目錄列表
6. add_executable(hello $(SRC_LIST}) 使用SRC_LIST源文件列表里的文件生成一個可執行文件hello
7. add_library(hello STATIC ${SRC_LIST}) 使用SRC_LIST源文件列表里的文件生成一個靜態鏈接庫libhello.a
8. add_library(hello SHARD ${SRC_LIST}) 使用SRC_LIST源文件列表里的文件生成一個動態鏈接庫libhello.so
9. target_link_libraries(hello a b.a c.so) 將若干庫文件鏈接到目標hello中,target_link_libraries里的庫文件的順序符合gcc/g++鏈接順序的規則,即被依賴的庫放在依賴它的庫的后面,如果順序有錯,鏈接時會報錯。
10. 自定義鏈接選項
11. 自定義Makefile目標
target_link_libraries(<target> ... <item> ... ...) 其中<target> 必須在當前目錄中被add_executable()命令或add_library()命令創建出來。
小型程序的CMakeLists.txt模板:
cmake_minimum_required(VERSION 2.8) //cmake的最低版本
project(example) //項目名
include_directories("/usr/include") //程序所需頭文件的位置
link_directories("/usr/lib") //程序所需庫文件的位置
add_executable(example example.cpp) //編譯example.cpp生成example對象文件
target_link_libraries(example gsl) //鏈接libgsl.a鏈接庫文件到example對象文件中
target_link_libraries(example gslcblas) //鏈接libgslcblas.a鏈接庫文件到example對象文件中
12. FIND_PATH(<VAR> name1 [path1 path2 ...]) 該命令在參數path1, path2...指示的目錄中查找文件name1並將查找到的路徑保存到變量VAR中
13. FIND_LIBRARY 同FIND_PATH類似,用於查找鏈接庫並將結果保存在變量中
Example:在開發軟件的時候我們會用到一些函數庫,這些函數庫在不同的系統中安裝的位置可能不同,編譯的時候需要首先找到這些頭文件以及鏈接庫所在的目錄以便生成編譯選項。
第一步,在項目的根目錄中創建目錄cmake/modules/, cmake/modules/下創建文件Findlibxx.cmake,內容如下:
MESSAGE(STATUS "Using budled findlibxx.cmake...")
FIND_PATH(
LIB_XX_INCLUDE_DIR
XX.h
/usr/include/
/use/local/include/
)
//在/usr/lib/ 和/usr/local/lib/目錄下,尋找名為xx的鏈接庫,並將結果保存在 LIB_XX_LIBRARIES中
FIND_LIBRARY(
LIB_XX_LIBRARIES NAMES XX
PATHS /usr/lib/ /usr/local/lib/
)
第二步,項目的根目錄中的CmakeList.txt
project(main)
cmake_minimum_required(version 2.8)
set(CMAKE_SOURCE_DIR .)
set(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules ${CMAKE_ROOT}/cmake/modules}
aux_source_directory(. DIR_SRCS)
add_executable(main ${DIR_SRCS})
find_package(XX required)
mark_as_advanced(
LIB_XX_INCLUDE_DIR
LIB_XX_LIBRARIES
)
