本文只是给出一个大概的说明,命令的详细用法以官方的参考手册为准
项目管理
命令 | 说明 |
---|---|
project(name) | 指定当前项目的名称,一般是第一句,不用打引号 |
cmake_minimum_required(VERSION 3.4.1) | 指定最低版本 |
if(UNIX) , endif() | 判断当前系统是否是 Unix/Linux |
if(WIN32) , endif() | 判断当前系统是否是 Windows |
if(str1 STREQUAL str2) , else() , endif() | 判断字符串是否相等 |
set(var value) | 设置值。如果值比较长,可以直接在引号里面换行,不需要 \n |
set(var value CACHE STRING "description") | 创建一个变量(选项),默认值为 value (用户可使用 -D 更改其值),可以把 STRING 改成 PATH 或 FILEPATH ,在 CMake GUI 中会变成目录选择对话框 |
option(var description OFF) | 添加一个开关选项,描述内容必须要填 |
message(STATUS|WARNING|FATAL_ERROR msg_text) | 输出状态信息,如果输出 FATAL_ERROR 则结束 |
add_subdirectory(dir) | 加载并处理一个子文件夹下的 CMakeLists.txt 文件 |
include(file_or_module) | 加载并处理一个 .cmake 文件 |
return() | 直接从当前 cmake 文件返回 |
ExternalProject_Add() | 从外部下载并构建项目(作用于编译期),详见官方文档 |
FetchContent_Declare() | 从外部下载项目(作用于配置期),详见官方文档 |
add_executable(target WIN32 sources) | 添加一个可执行文件(WIN32 表示入口点是 WinMain 而不是 main ,不影响 Linux) |
add_custom_command(...) | 添加编译前/后要执行的自定义命令,或者添加一个能生成一些文件的命令。参数较多请看官方文档 |
add_custom_target(...) | 添加新的编译目标,且可以自定义命令,参数较多请看官方文档 |
add_dependencies(target dep1 dep2) | 给一个编译目标(通常是 add_library 等创建的目标)添加依赖 |
install(TARGETS ${TARGT} RUNTIME DESTINATION dest_dir) | 安装命令,把编译后的文件复制到该文件夹下,参数较多请看官方文档 |
当你使用 ExternalProject_Add
、add_custom_command
、add_custom_target
执行自定义命令时,如果传入的命令是一个字符串,通常你需要使用 seperate_arguments(YOUR_OUT_CMD UNIX_COMMAND ${YOUR_COMMAND_STRING})
来将其切分。
源文件和头文件
命令 | 说明 |
---|---|
include_directories(dir_path...) | 指定头文件目录 |
aux_source_directory(dir_path SOURCES) | 把一个目录中的所有文件视为源文件加入到变量中,这里是 SOURCES |
configure_file(input_file output_file) | 指定一个配置文件(.in 文件) |
list(APPEND variable_name value) | 给列表加入一个项目,例如单独添加一个源文件 |
string(CONCAT dst_str str) | 字符串拼接 |
enable_language(ASM) | 添加汇编文件支持 |
add_definitions("-DXX -DXXX=XXX") | 增加宏定义 |
set_source_files_properties(file1 file2 PROPERTIES prop1 value1 prop2 value2) | 设置源文件的属性,如 EXTERNAL_OBJECT TRUE GENERATED TRUE 将允许使用现有的 obj 文件进行链接 |
库
命令 | 说明 |
---|---|
add_library(name SHARED|STATIC src_file_path...) | 添加一个库,多个路径之间不用逗号 |
add_library(name SHARED|STATIC IMPORTED) | 导入一个已经编译好的库 |
set_target_properties(name PROPERTIES IMPORTED_LOCATION lib_path) | 对于导入的库,手动指定它的位置 |
target_link_libraries(target_name lib_name ...) | 给程序链接依赖的静态库或动态库 |
target_compile_options(target_name PRIVATE|SHARED ...) | 给指定目标设置编译选项 |
target_link_options(target_name PRIVATE|SHARED ...) | 给指定目标设置链接选项 |
find_library(variable_name lib_name) | 搜索库,并赋给变量 |
link_directories(lib_path) | 指定链接器搜索目录 |
find_package(name COMPONENTS components REQUIRED) | 搜索包(如 wxWidgets),而且是必须找到 |
尝试静态链接C库,即使使用了 -static
发现仍然不是静态链接的。需要加上
set_target_properties(myexe PROPERTIES
LINK_SEARCH_START_STATIC ON
LINK_SEARCH_END_STATIC ON)
- 如果希望使用
find_package
来寻找一个包,则该包必须在/usr/lib/cmake/
等目录下提供了<PackageName>Config.cmake
或<lower-case-package-name>-config.cmake
。此外,还可以提供Find<PackageName>.cmake
,例如/usr/share/cmake-3.18/Modules/FindPython3.cmake
。参考 Using Dependencies Guide - 如果希望使用
pkg_search_module
来寻找一个包,则必须先执行include(FindPkgConfig)
,且该包必须提供了.pc
文件,.pc.in
示例如下:
prefix="@CMAKE_INSTALL_PREFIX@"
exec_prefix="${prefix}"
libdir="${prefix}/lib"
includedir="${prefix}/include"
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
URL: @PROJECT_HOMEPAGE_URL@
Version: @PROJECT_VERSION@
Cflags: -I${includedir}
Libs: -L${libdir} -lmy_library
使用时:
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/share/pkgconfig/${PROJECT_NAME}.pc.in
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
@ONLY
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig
)
变量
变量 | 说明 |
---|---|
CMAKE_PROJECT_NAME | 项目名称 |
CMAKE_CXX_STANDARD | C++ 标准,如 11 |
CMAKE_CXX_STANDARD_REQUIRED | 设置 ON |
CMAKE_CXX_FLAGS_DEBUG | C++ 调试编译时使用的标志 |
CMAKE_CXX_FLAGS_RELEASE | C++ 发行编译时使用的标志 |
CMAKE_EXE_LINKER_FLAGS | 链接时的标志 |
CMAKE_SHARED_LIBRARY_LINK_C_FLAGS | 共享库链接标志 |
CMAKE_BUILD_TYPE | 编译类型,Debug 、Release 、MinSizeRel 、RelWithDebInfo 四种 |
CMAKE_INSTALL_PREFIX | 安装目录前缀 |
CMAKE_MODULE_PATH | 模块路径,那里应该有一些 modulename.cmake 文件 |
TARGETS | 目标文件 |
SOURCES | 源文件 |
PROJECT_LINK_LIBS | 链接文件列表 |
CMAKE_SOURCE_DIR 或 PROJECT_SOURCE_DIR | 项目源文件路径(默认就是 CMakeList.txt 所在路径) |
CMAKE_BINARY_DIR 或 PROJECT_BINARY_DIR | 项目二进制文件路径(默认就是 CMakeList.txt 所在路径) |
CMAKE_CURRENT_BINARY_DIR | 外部编译时,指的是target目录,内部编译时,指的是顶级目录 |
CMAKE_CURRENT_SOURCE_DIR | CMakeList.txt 所在的目录 |
CMAKE_CURRENT_LIST_DIR | CMakeList.txt 的完整路径 |
CMAKE_TOOLCHAIN_FILE | CMake 将会自动处理这个变量指定的 CMake 文件,其中设置了交叉编译相关的变量 |
CMAKE_C_COMPILER | 指定 C 编译器 |
CMAKE_CXX_COMPILER | 指定 C++ 编译器 |
CMAKE_LINKER | 指定 LD 工具 |
CMAKE_OBJCOPY | 指定 OBJCOPY 工具 |
CMAKE_OBJDUMP | 指定 OBJDUMP 工具 |
CMAKE_SIZE | 指定 SIZE 工具 |
CMAKE_ASM_COMPILER | 指定汇编器 |
CMAKE_VERBOSE_MAKEFILE | 默认为 FALSE,设置为 TRUE 则显示 Makefile 的详细内容,用于调试构建系统 |