目录
1.常用 CMake 变量
1.1.编译与构建控制
CMAKE_BUILD_TYPE
构建类型(Debug
、Release
、RelWithDebInfo
、MinSizeRel
),影响优化和调试选项。CMAKE_C_COMPILER
/CMAKE_CXX_COMPILER
指定 C/C++ 编译器路径(如gcc
、clang
)。CMAKE_C_FLAGS
/CMAKE_CXX_FLAGS
全局 C/C++ 编译选项(如-Wall
、-std=c++17
)。CMAKE_EXE_LINKER_FLAGS
可执行文件链接选项(如-lpthread
)。CMAKE_C_STANDARD
/CMAKE_CXX_STANDARD
指定 C/C++ 语言标准版本(如11
、17
)。CMAKE_C_STANDARD_REQUIRED
强制要求编译器支持指定的 C 标准(布尔值)。
引用示例:
# 根据构建类型设置编译选项
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0")
endif()
# 指定 C++ 标准
set(CMAKE_CXX_STANDARD 20)
1.2.路径与目录变量
CMAKE_SOURCE_DIR
项目源文件根目录的绝对路径。CMAKE_BINARY_DIR
构建输出目录的绝对路径(外建模式下为独立目录)。PROJECT_SOURCE_DIR
当前project()
命令指定的源目录(多项目时区分子项目)。CMAKE_INSTALL_PREFIX
安装目标路径(默认/usr/local
,可修改为./install
等)。CMAKE_MODULE_PATH
CMake 模块(.cmake
文件)的搜索路径,用于find_package
或include
。- CMAKE_CURRENT_SOURCE_DIR
当前处理的 CMakeLists.txt 所在的源目录。 - CMAKE_CURRENT_BINARY_DIR
前处理的 CMakeLists.txt 对应的构建目录。
引用示例:
# 添加源文件
add_executable(my_app ${CMAKE_SOURCE_DIR}/src/main.cpp)
# 设置库输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
1.3.项目信息变量
PROJECT_NAME
项目名称(由project()
命令定义,如project(MyProject)
)。PROJECT_VERSION
项目版本(由project()
命令指定,如project(MyProject VERSION 1.2.3)
)。PROJECT_VERSION_MAJOR/MINOR/PATCH
自动拆分的主 / 次 / 补丁版本号(基于PROJECT_VERSION
)。
引用示例:
# 设置可执行文件版本
set_target_properties(my_app PROPERTIES VERSION ${PROJECT_VERSION})
1.4.系统与平台变量
CMAKE_SYSTEM_NAME
操作系统名称(如Linux
、Windows
、Darwin
)。CMAKE_SYSTEM_PROCESSOR
处理器架构(如x86_64
、arm64
、aarch64
)。WIN32
/UNIX/APPLE
布尔变量,标识是否为 Windows 或 Unix 类系统(APPLE
标识 macOS)。CMAKE_SIZEOF_VOID_P
指针大小(用于判断 32 位 / 64 位系统)。
引用示例:
# 根据平台设置不同的链接库
if(WIN32)
target_link_libraries(my_app PRIVATE ws2_32) # Windows 网络库
else()
target_link_libraries(my_app PRIVATE pthread) # Unix 线程库
endif()
1.5.工具链与交叉编译
CMAKE_TOOLCHAIN_FILE
工具链文件路径(用于交叉编译,如arm-linux-gnueabihf.toolchain.cmake
)。CMAKE_C_COMPILER_FORCED
/CMAKE_CXX_COMPILER_FORCED
强制指定编译器,忽略环境变量和默认搜索。CMAKE_CROSSCOMPILING
布尔变量,标识是否为交叉编译模式。
1.6.测试与安装变量
CMAKE_TEST_COMMAND
测试执行命令(默认ctest
,可修改为其他测试工具)。CMAKE_INSTALL_COMMAND
安装命令(默认make install
,对应不同生成器)。CMAKE_INSTALL_INCLUDEDIR/LIBDIR
安装时头文件 / 库文件的子目录(默认include
/lib
)。
1.7.高级编译选项
CMAKE_EXPORT_COMPILE_COMMANDS
布尔变量,生成compile_commands.json
(用于 clangd 等工具)。CMAKE_POSITION_INDEPENDENT_CODE
布尔变量,强制生成位置无关代码(PIC,用于动态库)。CMAKE_CXX_VISIBILITY_PRESET
设置符号可见性(如hidden
减少库暴露符号)。
2.常用环境变量
环境变量在 CMake 中通过 $ENV{VAR_NAME}
引用,常用于传递系统级配置。
2.1.编译器与工具链
环境变量名 | 描述 |
---|---|
CC |
C 编译器(如 gcc 、clang ) |
CXX |
C++ 编译器(如 g++ 、clang++ ) |
PATH |
系统搜索路径,影响 find_program 等命令 |
引用示例:
# 使用环境变量指定的编译器
if(DEFINED ENV{CC})
set(CMAKE_C_COMPILER $ENV{CC})
endif()
# 在 PATH 中查找工具
find_program(CLANG_FORMAT clang-format)
2.2.依赖库路径
环境变量名 | 描述 |
---|---|
LD_LIBRARY_PATH |
Linux 动态库搜索路径 |
DYLD_LIBRARY_PATH |
macOS 动态库搜索路径 |
CPATH |
C/C++ 头文件搜索路径 |
LIBRARY_PATH |
静态库搜索路径 |
引用示例:
# 从环境变量添加头文件搜索路径
include_directories($ENV{CPATH})
# 查找依赖库
find_library(FOO_LIB NAMES foo HINTS $ENV{LD_LIBRARY_PATH})
2.3.CMake 专用环境变量
环境变量名 | 描述 |
---|---|
CMAKE_PREFIX_PATH |
CMake 查找依赖的前缀路径(多个路径用 ; 分隔) |
BUILD_TYPE |
自定义构建类型(可替代 CMAKE_BUILD_TYPE ) |
引用示例:
# 使用环境变量设置构建类型
if(DEFINED ENV{BUILD_TYPE})
set(CMAKE_BUILD_TYPE $ENV{BUILD_TYPE})
endif()
# 从环境变量添加查找路径
list(APPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
3.变量与环境变量的区别
特性 | CMake 变量 | 环境变量 |
---|---|---|
定义方式 | set(VAR value) |
系统命令(如 export VAR=value ) |
作用域 | 局部或全局(取决于设置方式) | 全局(整个 shell 会话) |
引用方式 | ${VAR} |
$ENV{VAR} |
典型用途 | 项目内部配置、路径拼接 | 系统级配置、跨项目共享设置 |
4.变量引用实践
1.避免硬编码路径:
# 不推荐
include_directories("/usr/local/include")
# 推荐
include_directories(${CMAKE_INSTALL_PREFIX}/include)
2.环境变量默认值:
# 使用环境变量或默认值
set(MY_LIB_PATH $ENV{MY_LIB_PATH} CACHE PATH "自定义库路径")
if(NOT MY_LIB_PATH)
set(MY_LIB_PATH "/usr/local")
endif()
3.条件编译与平台适配:
if(WIN32)
set(PLATFORM_LIBS ws2_32)
elseif(APPLE)
set(PLATFORM_LIBS "-framework CoreFoundation")
else()
set(PLATFORM_LIBS pthread)
endif()
target_link_libraries(my_app PRIVATE ${PLATFORM_LIBS})
5.常见问题排查
1.变量未定义错误
- 使用
message(STATUS "VAR = ${VAR}")
打印变量值 - 通过
if(DEFINED VAR)
检查变量是否存在
2.环境变量不生效
- 确保环境变量在运行 CMake 前已设置
- 使用
message(STATUS "ENV_VAR = $ENV{VAR}")
验证环境变量值
3.跨平台差异
- Windows 环境变量区分大小写,Linux/macOS 通常不区分
- 路径分隔符:Windows 使用
\
,Unix 使用/
(CMake 中统一用/
)
6.查看所有内部变量
- 在命令行中运行
cmake -L
列出所有变量(含内部变量)。 - 使用
cmake-gui
并勾选 Advanced 选项,查看完整变量列表。 - 在 CMake 脚本中通过
message(STATUS ${VARIABLE_NAME})
打印变量值。
这些内部变量覆盖了编译、平台适配、路径管理等核心功能,合理使用可大幅提升 CMake 脚本的灵活性和可移植性。更多细节可查阅 CMake 官方变量文档。
相关链接
- CMake 官网 CMake - Upgrade Your Software Build System
- CMake 官方文档:CMake Tutorial — CMake 4.0.3 Documentation
- CMake 源码:https://github.com/Kitware/CMake
- CMake 源码:CMake · GitLab
- 中文版基础介绍: CMake 入门实战 | HaHack
- wiki: Home · Wiki · CMake / Community · GitLab
- Modern CMake 简体中文版: Introduction · Modern CMake