- 如果要尋找系統中有沒有特定函式庫,首先要確定有該函式庫的模組。可用
cmake --help-module-list 協助尋找是否該模組存在
- 如果有該模組,可以用
find_package 命令去找。注意該命令給定的名字必須符合前述搜尋模組給的名字,而不是系統中套件名稱。例如
# Find GLUT package in system.
# Not system package name like "freeglut3-dev".
find_package (GLUT REQUIRED)
- 如果要作不符合條件即中斷 Cmake 執行,可以使用
message(FATAL_ERROR "<message>") 的方式印出錯誤後中止執行。
例如前述尋找系統套件,找不到就可以用這種方式報錯離開
target_link_library 是該 Cmake 所針對的編譯單元,需要連結哪些函式庫
add_library 則是把該編譯單元包成函式庫,兩者目的相關方向相反
target_link_library 可以指定編譯器連結參數,例如
# Require compiler compiling with these arguments.
target_link_libraries(CGHW1 -lGL -lglut -lGLU)
- 這邊的連結參數會影響產生的 Makefile 中所下參數,所以是必要的
include_directory 是指定該次編譯尋找引入檔的目錄路徑(不知道非 C 類是否適用這概念?)
add_subdirectory 則是指定要遞回進子目錄,先作該 CMake 再回來
- 有些屬性要自己隨著目錄結構而設定,例如
IMPORTED_LOCATION 就關係到產生函式庫後擺放檔案的位置
- Cmake 2.8 還是需要在
else 這個關鍵字後面接上條件的樣子。不能如前面那樣省略,而是必需變成 else(<condition>)
- 推薦使用所謂 “Out-of-source Build” ,將建置目錄與原始碼目錄分開
- Cmake 執行時指定目錄,會自動找尋其中是否有 CMakeLists.txt 並利用執行
- Cmake 範例的結構中,看起來是每個模組或其他編譯單元的目錄中都各有一個 CMakeLists.txt ,整個專案再一個。
例如「Cmake 入門」中的範例:
lib1/
src/
app/
CMakeLists.txt
main.c
calc/
CMakeLists.txt
calc.c
calc.h
CMakeLists.txt