Cmake筆記

目錄


參考資料

1. 官方文檔
2. CMake Cookbook中文版

命令行

1. cmake

命令 解釋
Generate a Project Buildsystem cmake [<options>] <path-to-source>
cmake [<options>] <path-to-existing-build>
cmake [<options>] -S <path-to-source> -B <path-to-build>
Build a Project cmake --build <dir> [<options>] [-- <build-tool-options>]
Install a Project cmake --install <dir> [<options>]
Open a Project cmake --open <dir>
Run a Script cmake [{-D <var>=<value>}...] -P <cmake-script-file>
可以通過-D傳遞多個變量值,格式為KeyA:ValueA[::KeyX:ValueX],其中雙冒號分隔多個表達(dá)式,單冒號分隔每個表達(dá)式的變量和值,例如-DMODULE_ARGS=KeyA:ValueA::KeyX:ValueX
Run a Command-Line Tool cmake -E <command> [<options>]
調(diào)用cmake內(nèi)建的外部命令,比如拷貝命令,可以屏蔽系統(tǒng)差異
Run the Find-Package Tool cmake --find-package [<options>]
View Help cmake --help[-<topic>]

2. ctest

3. cpack

關(guān)鍵字

關(guān)鍵字 指令 & 解釋
PUBLIC
PRIVATE
INTERFACE
對于target_link_libraries(A XXX B):
PUBLIC: 任何鏈接到A的目標(biāo), 必須鏈接到B, 且A本身需要鏈接B
PRIVATE: 任何鏈接到A的目標(biāo), 不會鏈接到B, 但A本身需要鏈接B
INTERFACE: 任何鏈接到A的目標(biāo), 都會鏈接到B, 但A本身不鏈接B

對于target_include_directories(A XXX B):
PUBLIC: 任何鏈接到A的目標(biāo), 必須包含B文件夾, 且A本身需要包含B
PRIVATE: 任何鏈接到A的目標(biāo), 不會包含B文件夾, 但A本身需要包含B
INTERFACE: 任何鏈接到A的目標(biāo), 都會包含到B文件夾, 但A本身不包含B
in-source
out-source
in-source編譯就是把編譯輸出文件(包括.o文件)和CMakeLists.txt放在同一個目錄,比如直接執(zhí)行cmake .
out-source編譯就是把編譯輸出文件(包括.o文件)放到與CMakeLists.txt目錄不同的其他目錄,比如先進(jìn)入build目錄再執(zhí)行cmake ..

指令分類

Scripting Commands

指令 解釋
aux_source_directory() 用于自動生成目錄源文件集合
configure_file() 拷貝一份文件到指定位置并修改其內(nèi)容
execute_process() 執(zhí)行外部程序,具體參見鏈接
include() 加載并執(zhí)行指定的CMake文件或Module(即名字為<module>.cmake的文件,搜索路徑為CMAKE_MODULE_PATH)
find_package() 查找CMAKE_FRAMEWORK_PATH對應(yīng)的庫,使用方法:
1)find_package(MODULE)模式,先用CMAKE_MODULE_PATH找到Find<PackageName>.cmake, 然后用<PackageName>_ROOT或者CMAKE_PREFIX_PATH找到二進(jìn)制。
2)find_package(CONFIG)模式,用<PackageName>_ROOT或者CMAKE_PREFIX_PATH找到<PackageName>Config.cmake, 然后用<PackageName>Config.cmake的相對路徑找到二進(jìn)制。
file() 文件操作,具體參見鏈接
function() 自定義函數(shù)
get_filename_component() 獲取指定文件的信息,比如文件后綴名、絕對地址等
list() 鏈表操作,支持 APPEND, INSERT, FILTER, PREPEND, POP_BACK, POP_FRONT, REMOVE_AT, REMOVE_ITEM, REMOVE_DUPLICATES, REVERSE, SORT幾種操作
message() 輸出消息,不同的消息效果可能不同,比如有的會導(dǎo)致構(gòu)建停止,有的不會。等級有FATAL_ERROR、SEND_ERROR、WARNING、AUTHOR_WARNING、DEPRECATION、(none) or NOTICE、STATUS、VERBOSE、DEBUG、TRACE
macro() 自定義宏
option() 自定義提供一些開關(guān)選項(xiàng),用戶可以設(shè)置成ON或OFF,默認(rèn)是OFF。
string() 字符串相關(guān)操作,具體可以參見鏈接
set() 設(shè)置normal, cache, 或 environment變量值
separate_arguments() 將空格分隔的命令行形式字符串轉(zhuǎn)換成逗號分隔的列表模式
get_property(TARGET) 獲取一個對象屬性
set_property(TARGET) 在某個域中對零個或多個對象設(shè)置一個屬性,例如修改一個文件的編譯選項(xiàng):
set_property(
    SOURCE sub.c
    APPEND
    PROPERTY COMPILE_OPTIONS "-DDEBUG"
)

Project Commands

指令 解釋
add_compile_definitions() 可以給當(dāng)前目錄以及當(dāng)前目錄以下的目錄的 sources 添加編譯選項(xiàng)。
例如:add_compile_definitions (EX1 EX2)
不建議使用,建議用target_compile_definitions ( )代替
add_compile_options() 添加編譯選項(xiàng),例如add_compile_options(-Wall -Wextra -pedantic -Werror)
不建議使用,建議用target_compile_options ( )代替
add_link_options() 添加鏈接選項(xiàng)
不建議使用,建議用target_link_options()代替
add_custom_command 添加文件依賴,當(dāng)某個文件需要被用到時,會執(zhí)行該命令。需要在同一個CMakefile.txt文件中,通常有兩個作用:
場景1:使用OUTPUT參數(shù)指定輸出target,然后在add_custom_target中指定依賴于該target,這樣在構(gòu)建add_custom_target目標(biāo)時就會執(zhí)行add_custom_command 中設(shè)定的命令;
場景2:直接使用TARGET參數(shù)指定target,并設(shè)定在該target產(chǎn)生前或產(chǎn)生后執(zhí)行指定命令
add_custom_target 添加非文件依賴,總是被執(zhí)行。

add_custom_target(DEPENDS)用于依賴add_custom_command(OUTPUT)的輸出文件,編譯custom target時custom command的輸出文件也會被更新。其他target的依賴關(guān)系,請使用add_dependencies()命令。

注意,add_custom_target(DEPENDS)只能依賴同一CMakeLists.txt中的add_custom_command(OUTPUT)輸出文件,譬如下面的例子中依賴子目錄下的add_custom_command(OUTPUT)輸出文件將會失敗。
add_subdirectory() 跳轉(zhuǎn)到子目錄
add_executable() 生成可執(zhí)行文件
add_library() 指定目標(biāo),可以是庫或者可執(zhí)行文件
add_dependencies() 為目標(biāo)設(shè)置依賴
add_definitions(-DFOO -DBAR ...) 添加宏定義,已被add_compile_definitions()取代
get_target_property() 獲取構(gòu)建對象的屬性
include_directories() 添加頭文件路徑,相當(dāng)于編譯器參數(shù) -Idir1 -Idir2
link_libraries() 為所有目標(biāo)設(shè)置需要鏈接的庫
set_target_properties() 設(shè)置構(gòu)建對象的屬性
set_source_files_properties() 設(shè)置指定文件的屬性
target_sources() 設(shè)置源碼文件
target_include_directories() 設(shè)置單個目標(biāo)頭文件引用目錄
target_compile_definitions() 設(shè)置單個目標(biāo)預(yù)編譯宏,也可以通過-D添加
target_compile_features() 設(shè)置單個目標(biāo)編譯功能
target_compile_options() 設(shè)置單個目標(biāo)編譯選項(xiàng)
target_link_libraries() 設(shè)置單個目標(biāo)需要鏈接的庫
target_link_directories() 設(shè)置單個目標(biāo)鏈接目錄
target_link_options() 設(shè)置單個目標(biāo)鏈接選項(xiàng)

CTest Commands

Deprecated Commands

CMAKE變量

Variables that Provide Information

變量 解釋
CMAKE_AR
CMAKE_<LANG>_COMPILER_AR
CMAKE用來打靜態(tài)庫的工具名稱
CMAKE_COMMAND CMAKE可執(zhí)行文件的完整路徑,一般用于構(gòu)建過程中調(diào)用-E操作
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
${PROJECT_NAME}_BINARY_DIR
這三個變量內(nèi)容一致,如果是內(nèi)部編譯,就指的是工程的頂級目錄,如果是外部編譯,指的就是工程編譯發(fā)生的目錄
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
${PROJECT_NAME}_SOURCE_DIR
這三個變量內(nèi)容一致,都指的是工程的頂級目錄,即頂層CMakeLists.txt所在的路徑。
CMAKE_CURRENT_SOURCE_DIR 表示當(dāng)前代碼路徑,即當(dāng)前CMakeLists.txt所在的路徑。
CMAKE_CURRENT_BINARY_DIR 當(dāng)前CMakeLists.txt所在的路徑在目標(biāo)文件路徑下的映射。如果是in-source編譯,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource 編譯,他指的是target編譯目錄
CMAKE_CURRENT_LIST_DIR CMakeList.txt的完整路徑
CMAKE_CURRENT_LIST_LINE 當(dāng)前所在的行
CMAKE_CURRENT_LIST_FILE 輸出調(diào)用這個變量的CMakeLists.txt的完整路徑
CMAKE_CROSSCOMPILING 指示當(dāng)前是否是交叉編譯,如果CMAKE_SYSTEM_NAME變量被賦值,則該變量會自動配置為TRUE
CMAKE_TOOLCHAIN_FILE 指定交叉編譯工具的路徑
CMAKE_VERBOSE_MAKEFILE 構(gòu)建過程中輸出詳細(xì)信息,默認(rèn)為OFF,打開需要改為ON
PROJECT_NAME 項(xiàng)目名稱,通過project()指令配置的值
PROJECT_SOURCE_DIR 工程的根目錄
PROJECT_VERSION 項(xiàng)目版本,通過project()指令配置的值
OBJECT_LIST 當(dāng)前目標(biāo)所依賴的obj文件列表,可以通過${CMAKE_COMMAND} -E copy拷貝到指定位置

Variables that Change Behavior

變量 解釋
CMAKE_MODULE_PATH 如果工程復(fù)雜,可能需要編寫一些cmake模塊。
通過SET指定這個變量指定搜索路徑,模塊名為<modulename>.cmake。
CMAKE_BUILD_TYPE 可以是Debug, Release, RelWithDebInfo, MinSizeRel,可以通過CMAKE_C_FLAGS_<CONFIG>配置
CMAKE_INSTALL_PREFIX 最終編譯結(jié)果輸出目錄
CMAKE_PREFIX_PATH 指定package查找路徑,find_package(), find_program(), find_library(), find_file(), and find_path() commands命令會加上該路徑進(jìn)行查找
CMAKE_C_OUTPUT_EXTENSION_REPLACE
CMAKE_CXX_OUTPUT_EXTENSION_REPLACE
linux系統(tǒng)上,cmake默認(rèn)生成的object文件后綴為".c.o"或者".cpp.o"等。通過設(shè)置下面的變量,可以將源文件后綴".c"或者".cpp"去掉,變成".o"。
CMAKE_C_OUTPUT_EXTENSION
CMAKE_CXX_OUTPUT_EXTENSION
通過設(shè)置下面的變量,可以把object文件后綴從".c.o"或者".cpp.o"改成".c.obj"或者".cpp.obj"。

上述兩組變量同時使用,可以把object文件后綴從".c.o"或者".cpp.o"改成".obj"。

注意:1、在linux系統(tǒng)中, 即set(CMAKE_SYSTEM_NAME Linux)時,設(shè)置變量CMAKE_C_OUTPUT_EXTENSION是不生效的,需要將系統(tǒng)名稱改成Generic,如下:set(CMAKE_SYSTEM_NAME Generic)
2、上述設(shè)置必須寫在toolchain中,如果寫在CMakeLists.txt中,有時不會生效。

Variables that Describe the System

Variables that Control the Build

變量 解釋
CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG
CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE
設(shè)置debug和release版本輸出路徑
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE
設(shè)置debug和release版本庫文件的輸出路徑
CMAKE_DEBUG_POSTFIX
CMAKE_RELEASE_POSTFIX
設(shè)置debug和release版本庫文件的后綴名
set_target_properties(${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "_d")
set_target_properties(${TARGET_NAME} PROPERTIES RELEASE_POSTFIX "_r")
分別設(shè)置了Debug版本和Release版本下可執(zhí)行文件的后綴名.
EXECUTABLE_OUTPUT_PATH 可執(zhí)行輸出文件的存放位置
LIBRARY_OUTPUT_PATH 庫文件的輸出位置

Variables for Languages

變量 解釋
CMAKE_<LANG>_FLAGS 指定編譯選項(xiàng),不建議通過類似set(CMAKE_C_FLAGS “”)的方式修改,而是建議通過target_compile_options ( )添加編譯選項(xiàng)
CMAKE_<LANG>_COMPILER 指定語言對應(yīng)的編譯器
CMAKE_<LANG>_COMPILE_OBJECT 自定義編譯生成obj的策略,不使用cmake默認(rèn)的鏈接策略
CMAKE_<LANG>_LINK_EXECUTABLE 自定義鏈接策略,不使用cmake默認(rèn)的鏈接策略

Variables for CTest

Variables for CPack

Variable Expansion Operators

Internal Variables

CMAKE 屬性

Properties of Global Scope

Properties on Directories

Properties on Targets

Properties on Tests

Properties on Source Files

Properties on Cache Entries

Properties on Installed Files

Deprecated Properties on Directories

Deprecated Properties on Targets

Deprecated Properties on Source Files

CMake Module

:- | :-
CMakeDependentOption | 復(fù)雜編譯選項(xiàng)控制,如果option相互依賴關(guān)聯(lián)可以用這個模塊管理

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

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

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