CMake常用命令
基本語法
COMMAND(args...),多個參數(shù)用空白符分隔
常用命令
1. cmake_minimum_required(VERSION 3.4.1)
指定需要的最小的cmake版本
2. aux_source_directory
查找源文件并保存到相應(yīng)的變量中:
#查找當(dāng)前目錄下所有源文件并保存至SRC_LIST變量中
aux_source_directory(. SRC_LIST)
3. add_library
3.1 添加一個庫
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
- 添加一個名為
<name>的庫文件 - 指定
STATIC, SHARED, MODULE參數(shù)來指定要創(chuàng)建的庫的類型,STATIC對應(yīng)的靜態(tài)庫(.a),SHARED對應(yīng)共享動態(tài)庫(.so) -
[EXCLUDE_FROM_ALL], 如果指定了這一屬性,對應(yīng)的一些屬性會在目標(biāo)被創(chuàng)建時被設(shè)置(指明此目錄和子目錄中所有的目標(biāo),是否應(yīng)當(dāng)從默認(rèn)構(gòu)建中排除, 子目錄的IDE工程文件/Makefile將從頂級IDE工程文件/Makefile中排除) -
source1 source2 ... sourceN用來指定源文件
3.2 導(dǎo)入已有的庫
add_library(<name> [STATIC | SHARED | MODULE | UNKNOWN] IMPORTED)
導(dǎo)入了一個已存在的<name>庫文件,導(dǎo)入庫一般配合set_target_properties使用,這個命令用來指定導(dǎo)入庫的路徑,比如:
add_library(test SHARED IMPORTED)
set_target_properties( test #指定目標(biāo)庫名稱
PROPERTIES IMPORTED_LOCATION #指明要設(shè)置的參數(shù)
libs/src/${ANDROID_ABI}/libtest.so #設(shè)定導(dǎo)入庫的路徑)
4. set
設(shè)置CMake變量
例子:
# 設(shè)置可執(zhí)行文件的輸出路徑(EXCUTABLE_OUTPUT_PATH是全局變量)
set(EXECUTABLE_OUTPUT_PATH [output_path])
# 設(shè)置庫文件的輸出路徑(LIBRARY_OUTPUT_PATH是全局變量)
set(LIBRARY_OUTPUT_PATH [output_path])
# 設(shè)置C++編譯參數(shù)(CMAKE_CXX_FLAGS是全局變量)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")
# 設(shè)置源文件集合(SOURCE_FILES是本地變量即自定義變量)
set(SOURCE_FILES main.cpp test.cpp ...)
5. include_directories
設(shè)置頭文件位置
# 可以用相對貨絕對路徑,也可以用自定義的變量值
include_directories(./include ${MY_INCLUDE})
6. add_executable
添加可執(zhí)行文件
add_executable(<name> ${SRC_LIST})
7. target_link_libraries
將若干庫鏈接到目標(biāo)庫文件
target_link_libraries(<name> lib1 lib2 lib3)
將lib1, lib2, lib3鏈接到<name>上
NOTE: 鏈接的順序應(yīng)當(dāng)符合gcc鏈接順序規(guī)則,被鏈接的庫放在依賴它的庫的后面,即如果上面的命令中,lib1依賴于lib2, lib2又依賴于lib3,則在上面命令中必須嚴(yán)格按照
lib1 lib2 lib3的順序排列,否則會報錯
也可以自定義鏈接選項, 比如針對lib1使用-WL選項,target_link_libraries(<name> lib1 -WL, lib2 lib3)
8. add_definitions
為當(dāng)前路徑以及子目錄的源文件加入由-D引入得define flag
add_definitions(-DFOO -DDEBUG ...)
9. add_subdirectory
如果當(dāng)前目錄下還有子目錄時可以使用add_subdirectory,子目錄中也需要包含有CMakeLists.txt
# sub_dir指定包含CMakeLists.txt和源碼文件的子目錄位置
# binary_dir是輸出路徑, 一般可以不指定
add_subdirecroty(sub_dir [binary_dir])
10. file
文件操作命令
# 將message寫入filename文件中,會覆蓋文件原有內(nèi)容
file(WRITE filename "message")
# 將message寫入filename文件中,會追加在文件末尾
file(APPEND filename "message")
# 從filename文件中讀取內(nèi)容并存儲到var變量中,如果指定了numBytes和offset,
# 則從offset處開始最多讀numBytes個字節(jié),另外如果指定了HEX參數(shù),則內(nèi)容會以十六進制形式存儲在var變量中
file(READ filename var [LIMIT numBytes] [OFFSET offset] [HEX])
# 重命名文件
file(RENAME <oldname> <newname>)
# 刪除文件, 等于rm命令
file(REMOVE [file1 ...])
# 遞歸的執(zhí)行刪除文件命令, 等于rm -r
file(REMOVE_RECURSE [file1 ...])
# 根據(jù)指定的url下載文件
# timeout超時時間; 下載的狀態(tài)會保存到status中; 下載日志會被保存到log; sum指定所下載文件預(yù)期的MD5值,如果指定會自動進行比對,如果不一致,則返回一個錯誤; SHOW_PROGRESS,進度信息會以狀態(tài)信息的形式被打印出來
file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log] [EXPECTED_MD5 sum] [SHOW_PROGRESS])
# 創(chuàng)建目錄
file(MAKE_DIRECTORY [dir1 dir2 ...])
# 會把path轉(zhuǎn)換為以unix的/開頭的cmake風(fēng)格路徑,保存在result中
file(TO_CMAKE_PATH path result)
# 它會把cmake風(fēng)格的路徑轉(zhuǎn)換為本地路徑風(fēng)格:windows下用"\",而unix下用"/"
file(TO_NATIVE_PATH path result)
# 將會為所有匹配查詢表達式的文件生成一個文件list,并將該list存儲進變量variable里, 如果一個表達式指定了RELATIVE, 返回的結(jié)果將會是相對于給定路徑的相對路徑, 查詢表達式例子: *.cxx, *.vt?
NOTE: 按照官方文檔的說法,不建議使用file的GLOB指令來收集工程的源文件
file(GLOB variable [RELATIVE path] [globbing expressions]...)
11. set_directory_properties
設(shè)置某個路徑的一種屬性
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
prop1 prop代表屬性,取值為:
- INCLUDE_DIRECTORIES
- LINK_DIRECTORIES
- INCLUDE_REGULAR_EXPRESSION
- ADDITIONAL_MAKE_CLEAN_FILES
12. set_property
在給定的作用域內(nèi)設(shè)置一個命名的屬性
set_property(<GLOBAL |
DIRECTORY [dir] |
TARGET [target ...] |
SOURCE [src1 ...] |
TEST [test1 ...] |
CACHE [entry1 ...]>
[APPEND]
PROPERTY <name> [value ...])
第一個參數(shù)決定了屬性可以影響的作用域,必須為以下值:
- GLOBAL 全局作作用域,不接受名字
- DIRECTORY 默認(rèn)為當(dāng)前路徑,但是同樣也可以用[dir]指定路徑
- TARGET 目標(biāo)作用,可以是0個或多個已有的目標(biāo)
- SOURCE 源作用域, 可以是0個過多個源文件
- TEST 測試作用域, 可以是0個或多個已有的測試
- CACHE 必須指定0個或多個cache中已有的條目
PROPERTY參數(shù)是必須的