CMake 常用语法与函数方法指南
第1章:CMake 基础语法
1.1 CMake 基本结构
“`cmake
# 最低版本要求
cmake_minimum_required(VERSION 3.10)
# 项目定义
project(MyProject
VERSION 1.0.0
DESCRIPTION “项目描述”
LANGUAGES C CXX
)
# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
“`
1.2 变量操作
“`cmake
# 设置变量
set(MY_VARIABLE “value”)
set(MY_LIST item1 item2 item3)
# 列表操作
list(APPEND MY_LIST item4)
list(REMOVE_ITEM MY_LIST item2)
list(LENGTH MY_LIST list_length)
# 字符串操作
string(LENGTH ${MY_VARIABLE} str_len)
string(TOUPPER ${MY_VARIABLE} upper_str)
string(REPLACE “old” “new” result ${MY_VARIABLE})
# 条件判断
if(DEFINED MY_VARIABLE)
message(“变量已定义”)
elseif(MY_VARIABLE STREQUAL “value”)
message(“值相等”)
endif()
# 循环
foreach(item IN LISTS MY_LIST)
message(“Item: ${item}”)
endforeach()
foreach(i RANGE 1 10)
message(“Index: ${i}”)
endforeach()
“`
第2章:常用命令与函数
2.1 项目配置命令
“`cmake
# 添加可执行文件
add_executable(target_name source1.cpp source2.cpp)
# 添加库
add_library(lib_name STATIC source.cpp) # 静态库
add_library(lib_name SHARED source.cpp) # 动态库
add_library(lib_name INTERFACE) # 接口库
# 包含目录
include_directories(${CMAKE_SOURCE_DIR}/include)
target_include_directories(target_name
PUBLIC ${CMAKE_SOURCE_DIR}/include
PRIVATE ${CMAKE_SOURCE_DIR}/src
)
# 链接库
target_link_libraries(target_name
PRIVATE library1 library2
PUBLIC library3
)
“`
2.2 文件操作命令
“`cmake
# 文件查找
file(GLOB source_files “src/*.cpp”)
file(GLOB_RECURSE all_sources “src/*.cpp” “include/*.h”)
# 文件操作
file(READ filename variable)
file(WRITE filename “content”)
file(APPEND filename “more content”)
file(COPY files… DESTINATION dir)
# 目录操作
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated)
“`
2.3 控制流命令
“`cmake
# 条件编译
option(ENABLE_FEATURE “启用特性” ON)
if(ENABLE_FEATURE)
add_definitions(-DENABLE_FEATURE)
endif()
# 平台检测
if(WIN32)
message(“Windows平台”)
elseif(UNIX AND NOT APPLE)
message(“Linux平台”)
elseif(APPLE)
message(“macOS平台”)
endif()
# 循环控制
while(condition)
# 循环体
break() # 退出循环
continue() # 继续下一次循环
endwhile()
“`
2.4 消息与调试
“`cmake
# 输出消息
message(“普通消息”)
message(STATUS “状态消息”)
message(WARNING “警告消息”)
message(AUTHOR_WARNING “作者警告”)
message(SEND_ERROR “发送错误”)
message(FATAL_ERROR “致命错误”)
# 变量打印
message(“变量值: ${MY_VARIABLE}”)
“`
第3章:常用内置函数
3.1 字符串处理函数
“`cmake
# 字符串查找
string(FIND ${str} substring result)
string(SUBSTRING ${str} 0 5 result)
# 正则表达式
string(REGEX MATCH “pattern” result ${str})
string(REGEX REPLACE “old” “new” result ${str})
# 格式转换
string(TIMESTAMP output “%Y-%m-%d %H:%M:%S”)
“`
3.2 数学运算函数
“`cmake
# 数学计算
math(EXPR result “1 + 2 * 3”)
math(EXPR hex_value “0x${hex_string}” OUTPUT_FORMAT HEXADECIMAL)
“`
3.3 路径处理函数
“`cmake
# 路径操作
get_filename_component(dir_name ${path} DIRECTORY)
get_filename_component(file_name ${path} NAME)
get_filename_component(base_name ${path} NAME_WE)
get_filename_component(ext_name ${path} EXT)
# 路径转换
file(RELATIVE_PATH rel_path ${base_dir} ${full_path})
“`
3.4 配置相关函数
“`cmake
# 配置头文件
configure_file(config.h.in config.h)
# 生成导出头文件
include(GenerateExportHeader)
generate_export_header(TARGET_NAME)
# 添加子目录
add_subdirectory(subdir)
“`
第4章:高级特性
4.1 函数与宏
“`cmake
# 定义函数(有作用域)
function(my_function arg1 arg2)
set(${arg1}_local “value” PARENT_SCOPE)
message(“参数: ${arg1}, ${arg2}”)
endfunction()
# 定义宏(无作用域)
macro(my_macro arg1 arg2)
set(${arg1}_global “value”)
message(“参数: ${arg1}, ${arg2}”)
endmacro()
“`
4.2 生成器表达式
“`cmake
# 条件表达式
target_compile_definitions(target_name
PRIVATE $<$<CONFIG:Debug>:DEBUG_MODE>
)
# 目标属性表达式
$<TARGET_FILE:target_name>
$<TARGET_LINKER_FILE:target_name>
$<TARGET_PROPERTY:target_name,prop_name>
# 字符串生成器
$<UPPER_CASE:${string}>
$<LOWER_CASE:${string}>
“`
4.3 自定义命令
“`cmake
# 添加自定义命令
add_custom_command(
OUTPUT output_file
COMMAND ${CMAKE_COMMAND} -E echo “Building…”
DEPENDS input_file
COMMENT “正在生成文件”
)
# 自定义目标
add_custom_target(custom_target
COMMAND ${CMAKE_COMMAND} -E echo “Running…”
DEPENDS dependency_target
)
“`
—
CMake 常用内置变量表格
平台与系统变量
变量名 描述 示例值
CMAKE_SYSTEM_NAME 操作系统名称 Linux, Windows, Darwin
CMAKE_SYSTEM_VERSION 操作系统版本 10.0.19041
CMAKE_SYSTEM_PROCESSOR 处理器架构 x86_64, AMD64, ARM64
WIN32 Windows平台标识 TRUE (Windows)
UNIX Unix-like平台标识 TRUE (Linux/macOS)
APPLE Apple平台标识 TRUE (macOS/iOS)
ANDROID Android平台标识 TRUE (Android)
MSVC MSVC编译器标识 TRUE (Visual Studio)
项目路径变量
变量名 描述 示例值
CMAKE_SOURCE_DIR 顶层CMakeLists.txt所在目录 /home/user/project
CMAKE_BINARY_DIR 构建目录(build) /home/user/project/build
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt目录 /home/user/project/src
CMAKE_CURRENT_BINARY_DIR 当前构建目录
/home/user/project/build/src
CMAKE_CURRENT_LIST_DIR 当前正在处理的CMake文件目录 /home/user/project/cmake
CMAKE_CURRENT_LIST_FILE 当前正在处理的CMake文件路径
/home/user/project/cmake/module.cmake
编译器相关变量
变量名 描述 示例值
CMAKE_C_COMPILER C编译器路径 /usr/bin/gcc
CMAKE_CXX_COMPILER C++编译器路径 /usr/bin/g++
CMAKE_C_COMPILER_ID C编译器ID GNU, Clang, MSVC
CMAKE_CXX_COMPILER_ID C++编译器ID GNU, Clang, MSVC
CMAKE_C_FLAGS C编译器标志 -Wall -Wextra
CMAKE_CXX_FLAGS C++编译器标志 -Wall -Wextra -std=c++11
CMAKE_BUILD_TYPE 构建类型 Debug, Release, RelWithDebInfo, MinSizeRel
安装相关变量
变量名 描述 默认值
CMAKE_INSTALL_PREFIX 安装前缀 /usr/local (Unix), C:/Program Files (Windows)
CMAKE_INSTALL_BINDIR 可执行文件安装目录 bin
CMAKE_INSTALL_LIBDIR 库文件安装目录 lib
CMAKE_INSTALL_INCLUDEDIR 头文件安装目录 include
CMAKE_INSTALL_DATADIR 数据文件安装目录 share
生成器相关变量
变量名 描述 示例值
CMAKE_GENERATOR CMake生成器 Unix Makefiles, Ninja, Visual Studio 16 2019
CMAKE_MAKE_PROGRAM Make程序路径 /usr/bin/make, /usr/bin/ninja
CMAKE_BUILD_TOOL 构建工具 msbuild.exe, devenv.exe
模块与包变量
变量名 描述 示例值
CMAKE_MODULE_PATH CMake模块搜索路径 /home/user/cmake/modules
CMAKE_PREFIX_PATH 包搜索路径 /usr/local;/opt/local
CMAKE_INCLUDE_PATH 头文件搜索路径
CMAKE_LIBRARY_PATH 库文件搜索路径
目标文件变量
变量名 描述 示例值
CMAKE_RUNTIME_OUTPUT_DIRECTORY 可执行文件输出目录 ${CMAKE_BINARY_DIR}/bin
CMAKE_LIBRARY_OUTPUT_DIRECTORY 库文件输出目录 ${CMAKE_BINARY_DIR}/lib
CMAKE_ARCHIVE_OUTPUT_DIRECTORY 静态库输出目录 ${CMAKE_BINARY_DIR}/lib
CMAKE_CURRENT_LIST_LINE 当前处理的行号 42
版本信息变量
变量名 描述 示例值
CMAKE_VERSION CMake版本 3.22.1
CMAKE_MAJOR_VERSION CMake主版本 3
CMAKE_MINOR_VERSION CMake次版本 22
CMAKE_PATCH_VERSION CMake补丁版本 1
配置相关变量
变量名 描述 示例值
CMAKE_CONFIGURATION_TYPES 多配置生成器的配置类型 Debug;Release;MinSizeRel;RelWithDebInfo
CMAKE_CFG_INTDIR 配置相关中间目录 . (Makefile), $(Configuration) (VS)
CMAKE_BUILD_TYPE 单配置生成器的构建类型 Debug, Release
编译特性变量
变量名 描述 示例值
CMAKE_C_COMPILE_FEATURES C编译器支持的特性列表 c_std_99;c_std_11
CMAKE_CXX_COMPILE_FEATURES C++编译器支持的特性列表 cxx_std_11;cxx_std_14;cxx_std_17
CMAKE_C_STANDARD C语言标准 11, 99
CMAKE_CXX_STANDARD C++语言标准 11, 14, 17, 20
测试相关变量
变量名 描述 示例值
CMAKE_CTEST_COMMAND CTest命令路径 /usr/local/bin/ctest
CMAKE_TESTING_ENABLED 是否启用测试 ON
—
附录:实用代码片段
A.1 常用宏定义
“`cmake
# 打印所有变量
macro(print_all_variables)
get_cmake_property(vars VARIABLES)
foreach(var ${vars})
message(“${var}=${${var}}”)
endforeach()
endmacro()
# 打印目标属性
function(print_target_properties target)
if(NOT TARGET ${target})
message(“目标 ${target} 不存在”)
return()
endif()
get_target_property(target_type ${target} TYPE)
message(“目标: ${target} (类型: ${target_type})”)
set(props IMPORTED_LOCATION IMPORTED_LOCATION_<CONFIG>
INTERFACE_INCLUDE_DIRECTORIES INTERFACE_LINK_LIBRARIES
INCLUDE_DIRECTORIES LINK_LIBRARIES COMPILE_DEFINITIONS
COMPILE_OPTIONS)
foreach(prop ${props})
get_target_property(prop_val ${target} ${prop})
if(prop_val)
message(” ${prop}: ${prop_val}”)
endif()
endforeach()
endfunction()
“`
A.2 常用函数
“`cmake
# 递归查找源文件
function(find_sources_recursive return_var directory)
file(GLOB_RECURSE sources
“${directory}/*.cpp”
“${directory}/*.c”
“${directory}/*.cc”
“${directory}/*.cxx”
)
set(${return_var} ${sources} PARENT_SCOPE)
endfunction()
# 设置目标标准
function(set_target_standard target standard)
set_target_properties(${target} PROPERTIES
CXX_STANDARD ${standard}
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF
)
endfunction()
“`
A.3 版本配置模板
“`cmake
# version.h.in
#define PROJECT_NAME “@PROJECT_NAME@”
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
#define PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@
#define PROJECT_VERSION “@PROJECT_VERSION@”
“`
本指南涵盖了CMake的常用语法、函数和内置变量




