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],其中双冒号分隔多个表达式,单冒号分隔每个表达式的变量和值,例如-DMODULE_ARGS=KeyA:ValueA::KeyX:ValueX
Run a Command-Line Tool cmake -E <command> [<options>]
调用cmake内建的外部命令,比如拷贝命令,可以屏蔽系统差异
Run the Find-Package Tool cmake --find-package [<options>]
View Help cmake --help[-<topic>]

2. ctest

3. cpack

关键字

关键字 指令 & 解释
PUBLIC
PRIVATE
INTERFACE
对于target_link_libraries(A XXX B):
PUBLIC: 任何链接到A的目标, 必须链接到B, 且A本身需要链接B
PRIVATE: 任何链接到A的目标, 不会链接到B, 但A本身需要链接B
INTERFACE: 任何链接到A的目标, 都会链接到B, 但A本身不链接B

对于target_include_directories(A XXX B):
PUBLIC: 任何链接到A的目标, 必须包含B文件夹, 且A本身需要包含B
PRIVATE: 任何链接到A的目标, 不会包含B文件夹, 但A本身需要包含B
INTERFACE: 任何链接到A的目标, 都会包含到B文件夹, 但A本身不包含B
in-source
out-source
in-source编译就是把编译输出文件(包括.o文件)和CMakeLists.txt放在同一个目录,比如直接执行cmake .
out-source编译就是把编译输出文件(包括.o文件)放到与CMakeLists.txt目录不同的其他目录,比如先进入build目录再执行cmake ..

指令分类

Scripting Commands

指令 解释
aux_source_directory() 用于自动生成目录源文件集合
configure_file() 拷贝一份文件到指定位置并修改其内容
execute_process() 执行外部程序,具体参见链接
include() 加载并执行指定的CMake文件或Module(即名字为<module>.cmake的文件,搜索路径为CMAKE_MODULE_PATH)
find_package() 查找CMAKE_FRAMEWORK_PATH对应的库,使用方法:
1)find_package(MODULE)模式,先用CMAKE_MODULE_PATH找到Find<PackageName>.cmake, 然后用<PackageName>_ROOT或者CMAKE_PREFIX_PATH找到二进制。
2)find_package(CONFIG)模式,用<PackageName>_ROOT或者CMAKE_PREFIX_PATH找到<PackageName>Config.cmake, 然后用<PackageName>Config.cmake的相对路径找到二进制。
file() 文件操作,具体参见链接
function() 自定义函数
get_filename_component() 获取指定文件的信息,比如文件后缀名、绝对地址等
list() 链表操作,支持 APPEND, INSERT, FILTER, PREPEND, POP_BACK, POP_FRONT, REMOVE_AT, REMOVE_ITEM, REMOVE_DUPLICATES, REVERSE, SORT几种操作
message() 输出消息,不同的消息效果可能不同,比如有的会导致构建停止,有的不会。等级有FATAL_ERROR、SEND_ERROR、WARNING、AUTHOR_WARNING、DEPRECATION、(none) or NOTICE、STATUS、VERBOSE、DEBUG、TRACE
macro() 自定义宏
option() 自定义提供一些开关选项,用户可以设置成ON或OFF,默认是OFF。
string() 字符串相关操作,具体可以参见链接
set() 设置normal, cache, 或 environment变量值
separate_arguments() 将空格分隔的命令行形式字符串转换成逗号分隔的列表模式
get_property(TARGET) 获取一个对象属性
set_property(TARGET) 在某个域中对零个或多个对象设置一个属性,例如修改一个文件的编译选项:
set_property(
    SOURCE sub.c
    APPEND
    PROPERTY COMPILE_OPTIONS "-DDEBUG"
)

Project Commands

指令 解释
add_compile_definitions() 可以给当前目录以及当前目录以下的目录的 sources 添加编译选项。
例如:add_compile_definitions (EX1 EX2)
不建议使用,建议用target_compile_definitions ( )代替
add_compile_options() 添加编译选项,例如add_compile_options(-Wall -Wextra -pedantic -Werror)
不建议使用,建议用target_compile_options ( )代替
add_link_options() 添加链接选项
不建议使用,建议用target_link_options()代替
add_custom_command 添加文件依赖,当某个文件需要被用到时,会执行该命令。需要在同一个CMakefile.txt文件中,通常有两个作用:
场景1:使用OUTPUT参数指定输出target,然后在add_custom_target中指定依赖于该target,这样在构建add_custom_target目标时就会执行add_custom_command 中设定的命令;
场景2:直接使用TARGET参数指定target,并设定在该target产生前或产生后执行指定命令
add_custom_target 添加非文件依赖,总是被执行。

add_custom_target(DEPENDS)用于依赖add_custom_command(OUTPUT)的输出文件,编译custom target时custom command的输出文件也会被更新。其他target的依赖关系,请使用add_dependencies()命令。

注意,add_custom_target(DEPENDS)只能依赖同一CMakeLists.txt中的add_custom_command(OUTPUT)输出文件,譬如下面的例子中依赖子目录下的add_custom_command(OUTPUT)输出文件将会失败。
add_subdirectory() 跳转到子目录
add_executable() 生成可执行文件
add_library() 指定目标,可以是库或者可执行文件
add_dependencies() 为目标设置依赖
add_definitions(-DFOO -DBAR ...) 添加宏定义,已被add_compile_definitions()取代
get_target_property() 获取构建对象的属性
include_directories() 添加头文件路径,相当于编译器参数 -Idir1 -Idir2
link_libraries() 为所有目标设置需要链接的库
set_target_properties() 设置构建对象的属性
set_source_files_properties() 设置指定文件的属性
target_sources() 设置源码文件
target_include_directories() 设置单个目标头文件引用目录
target_compile_definitions() 设置单个目标预编译宏,也可以通过-D添加
target_compile_features() 设置单个目标编译功能
target_compile_options() 设置单个目标编译选项
target_link_libraries() 设置单个目标需要链接的库
target_link_directories() 设置单个目标链接目录
target_link_options() 设置单个目标链接选项

CTest Commands

Deprecated Commands

CMAKE变量

Variables that Provide Information

变量 解释
CMAKE_AR
CMAKE_<LANG>_COMPILER_AR
CMAKE用来打静态库的工具名称
CMAKE_COMMAND CMAKE可执行文件的完整路径,一般用于构建过程中调用-E操作
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
${PROJECT_NAME}_BINARY_DIR
这三个变量内容一致,如果是内部编译,就指的是工程的顶级目录,如果是外部编译,指的就是工程编译发生的目录
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
${PROJECT_NAME}_SOURCE_DIR
这三个变量内容一致,都指的是工程的顶级目录,即顶层CMakeLists.txt所在的路径。
CMAKE_CURRENT_SOURCE_DIR 表示当前代码路径,即当前CMakeLists.txt所在的路径。
CMAKE_CURRENT_BINARY_DIR 当前CMakeLists.txt所在的路径在目标文件路径下的映射。如果是in-source编译,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource 编译,他指的是target编译目录
CMAKE_CURRENT_LIST_DIR CMakeList.txt的完整路径
CMAKE_CURRENT_LIST_LINE 当前所在的行
CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_CROSSCOMPILING 指示当前是否是交叉编译,如果CMAKE_SYSTEM_NAME变量被赋值,则该变量会自动配置为TRUE
CMAKE_TOOLCHAIN_FILE 指定交叉编译工具的路径
CMAKE_VERBOSE_MAKEFILE 构建过程中输出详细信息,默认为OFF,打开需要改为ON
PROJECT_NAME 项目名称,通过project()指令配置的值
PROJECT_SOURCE_DIR 工程的根目录
PROJECT_VERSION 项目版本,通过project()指令配置的值
OBJECT_LIST 当前目标所依赖的obj文件列表,可以通过${CMAKE_COMMAND} -E copy拷贝到指定位置

Variables that Change Behavior

变量 解释
CMAKE_MODULE_PATH 如果工程复杂,可能需要编写一些cmake模块。
通过SET指定这个变量指定搜索路径,模块名为<modulename>.cmake。
CMAKE_BUILD_TYPE 可以是Debug, Release, RelWithDebInfo, MinSizeRel,可以通过CMAKE_C_FLAGS_<CONFIG>配置
CMAKE_INSTALL_PREFIX 最终编译结果输出目录
CMAKE_PREFIX_PATH 指定package查找路径,find_package(), find_program(), find_library(), find_file(), and find_path() commands命令会加上该路径进行查找
CMAKE_C_OUTPUT_EXTENSION_REPLACE
CMAKE_CXX_OUTPUT_EXTENSION_REPLACE
linux系统上,cmake默认生成的object文件后缀为".c.o"或者".cpp.o"等。通过设置下面的变量,可以将源文件后缀".c"或者".cpp"去掉,变成".o"。
CMAKE_C_OUTPUT_EXTENSION
CMAKE_CXX_OUTPUT_EXTENSION
通过设置下面的变量,可以把object文件后缀从".c.o"或者".cpp.o"改成".c.obj"或者".cpp.obj"。

上述两组变量同时使用,可以把object文件后缀从".c.o"或者".cpp.o"改成".obj"。

注意:1、在linux系统中, 即set(CMAKE_SYSTEM_NAME Linux)时,设置变量CMAKE_C_OUTPUT_EXTENSION是不生效的,需要将系统名称改成Generic,如下:set(CMAKE_SYSTEM_NAME Generic)
2、上述设置必须写在toolchain中,如果写在CMakeLists.txt中,有时不会生效。

Variables that Describe the System

Variables that Control the Build

变量 解释
CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG
CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE
设置debug和release版本输出路径
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE
设置debug和release版本库文件的输出路径
CMAKE_DEBUG_POSTFIX
CMAKE_RELEASE_POSTFIX
设置debug和release版本库文件的后缀名
set_target_properties(${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "_d")
set_target_properties(${TARGET_NAME} PROPERTIES RELEASE_POSTFIX "_r")
分别设置了Debug版本和Release版本下可执行文件的后缀名.
EXECUTABLE_OUTPUT_PATH 可执行输出文件的存放位置
LIBRARY_OUTPUT_PATH 库文件的输出位置

Variables for Languages

变量 解释
CMAKE_<LANG>_FLAGS 指定编译选项,不建议通过类似set(CMAKE_C_FLAGS “”)的方式修改,而是建议通过target_compile_options ( )添加编译选项
CMAKE_<LANG>_COMPILER 指定语言对应的编译器
CMAKE_<LANG>_COMPILE_OBJECT 自定义编译生成obj的策略,不使用cmake默认的链接策略
CMAKE_<LANG>_LINK_EXECUTABLE 自定义链接策略,不使用cmake默认的链接策略

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 | 复杂编译选项控制,如果option相互依赖关联可以用这个模块管理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容