CMake常用語法總結(jié)

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ù)是必須的

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • CMake學(xué)習(xí) 本篇分享一下有關(guān)CMake的一些學(xué)習(xí)心得以及相關(guān)使用。 本文目錄如下: [1、CMake介紹] [...
    AlphaGL閱讀 12,445評論 11 79
  • 1.安裝 $sudo apt-get install cmake 2.示例:簡單的文件目錄 sample |—...
    荷包蛋醬閱讀 29,916評論 0 15
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,328評論 2 33
  • 注:首發(fā)地址 1. 前言 當(dāng)在做 Android NDK 開發(fā)時,如果不熟悉用 CMake 來構(gòu)建,讀不懂 CMa...
    cfanr閱讀 24,803評論 1 53
  • 不記得是連續(xù)多少個周末加班了,剛才出門時兒子抱著我的腿哭的稀里嘩啦,邊哭變說“就要爸爸在家里.....”,怎么也不...
    senhoa閱讀 209評論 0 0

友情鏈接更多精彩內(nèi)容