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相互依赖关联可以用这个模块管理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容