提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
CMake 的预定义内置变量是 CMake 在配置阶段(执行 cmake 命令时)自动生成的变量,无需用户手动声明,用于提供环境信息、控制构建行为或配置项目细节。这些变量按用途可分为多个类别,以下是常见分类及每类中高频使用的变量详解:
一、平台与系统检测类
用于识别目标系统(操作系统、架构、位数等),是跨平台项目适配的核心变量。
| 变量名 | 作用说明 | 取值示例/类型 |
|---|---|---|
WIN32 | 标识目标系统是否为 Windows(包括 32 位和 64 位 Windows)。 | 布尔值(TRUE/FALSE) |
UNIX | 标识目标系统是否为类 Unix 系统(包括 Linux、macOS、FreeBSD 等)。 | 布尔值(TRUE/FALSE) |
APPLE | 标识目标系统是否为 Apple 系统(macOS、iOS、iPadOS 等)。 | 布尔值(TRUE/FALSE) |
CMAKE_SYSTEM_NAME | 存储目标系统的名称(字符串),用于精确判断系统类型。 | 字符串("Windows"/"Linux"/"Darwin"(macOS)等) |
CMAKE_SYSTEM_PROCESSOR | 存储目标处理器架构(如 x86、ARM 等)。 | 字符串("x86_64"/"arm64"/"i386"等) |
CMAKE_SIZEOF_VOID_P | 存储 void* 类型的字节数,用于判断系统位数(32 位为 4,64 位为 8)。 | 整数(4 或 8) |
二、构建路径与目录类
用于定位项目源代码、构建文件、输出文件等路径,是管理项目目录结构的核心变量。
| 变量名 | 作用说明 | 示例路径 |
|---|---|---|
CMAKE_SOURCE_DIR | 顶级 CMakeLists.txt 所在的目录(整个项目的根目录),不受子项目影响。 | /home/user/project |
CMAKE_BINARY_DIR | 构建目录(执行 cmake 命令时的当前目录,通常是 build 目录)。 | /home/user/project/build |
PROJECT_SOURCE_DIR | 当前 project() 命令所在的目录(若在子项目中,指子项目的源代码目录)。 | /home/user/project/submodule |
PROJECT_BINARY_DIR | 当前项目的构建目录(子项目的构建目录,通常在顶级构建目录下对应子目录)。 | /home/user/project/build/submodule |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的 CMakeLists.txt 所在的目录(随脚本位置动态变化)。 | /home/user/project/src |
CMAKE_CURRENT_BINARY_DIR | 当前 CMakeLists.txt 对应的构建目录(生成的中间文件存放处)。 | /home/user/project/build/src |
CMAKE_INSTALL_PREFIX | 安装路径的前缀(make install 时文件的默认安装根目录)。 | 默认为 /usr/local(Unix)或 C:/Program Files(Windows) |
三、编译器与语言配置类
用于指定编译器路径、语言标准、编译选项等,控制代码编译过程。
| 变量名 | 作用说明 | 取值示例 |
|---|---|---|
CMAKE_C_COMPILER | C 编译器的路径(自动检测或用户指定)。 | /usr/bin/gcc 或 C:/MSVC/cl.exe |
CMAKE_CXX_COMPILER | C++ 编译器的路径(自动检测或用户指定)。 | /usr/bin/g++ 或 C:/MSVC/cl.exe |
CMAKE_C_STANDARD | 指定 C 语言标准(如 C99、C11)。 | 整数(99/11/17 等) |
CMAKE_CXX_STANDARD | 指定 C++ 语言标准(如 C++11、C++17、C++20)。 | 整数(11/17/20 等) |
CMAKE_C_STANDARD_REQUIRED | 是否强制要求指定的 C 标准(若不支持则报错)。 | 布尔值(ON/OFF,默认 OFF) |
CMAKE_CXX_STANDARD_REQUIRED | 是否强制要求指定的 C++ 标准(若不支持则报错)。 | 布尔值(ON/OFF,默认 OFF) |
CMAKE_C_FLAGS | C 编译器的全局编译选项(适用于所有构建类型)。 | -Wall -O2(GCC) |
CMAKE_CXX_FLAGS | C++ 编译器的全局编译选项(适用于所有构建类型)。 | -Wall -std=c++17(GCC) |
CMAKE_CXX_FLAGS_DEBUG | Debug 模式下的 C++ 编译选项(如启用调试符号)。 | -g -O0(GCC) |
CMAKE_CXX_FLAGS_RELEASE | Release 模式下的 C++ 编译选项(如优化)。 | -O3 -DNDEBUG(GCC) |
四、构建类型与模式类
用于控制构建的模式(如 Debug/Release)、多配置生成器行为等。
| 变量名 | 作用说明 | 取值示例 |
|---|---|---|
CMAKE_BUILD_TYPE | 为单配置生成器(如 Makefile、Ninja)指定构建类型(仅在配置时生效)。 | 字符串("Debug"/"Release"/"RelWithDebInfo"等) |
CMAKE_CONFIGURATION_TYPES | 为多配置生成器(如 Visual Studio、Xcode)指定支持的构建类型。 | 列表("Debug;Release;MinSizeRel") |
BUILD_SHARED_LIBS | 控制 add_library 命令的默认行为:ON 生成共享库(.so/.dll),OFF 生成静态库(.a/.lib)。 | 布尔值(ON/OFF,默认 OFF) |
五、目标文件输出类
用于指定可执行文件、库文件的输出目录,统一管理构建产物。
| 变量名 | 作用说明 | 示例路径 |
|---|---|---|
CMAKE_RUNTIME_OUTPUT_DIRECTORY | 可执行文件(.exe 等)的输出目录(适用于所有构建类型)。 | ${CMAKE_BINARY_DIR}/bin |
CMAKE_LIBRARY_OUTPUT_DIRECTORY | 共享库(.so/.dll)的输出目录(适用于所有构建类型)。 | ${CMAKE_BINARY_DIR}/lib |
CMAKE_ARCHIVE_OUTPUT_DIRECTORY | 静态库(.a/.lib)的输出目录(适用于所有构建类型)。 | ${CMAKE_BINARY_DIR}/lib |
CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG | Debug 模式下可执行文件的输出目录(覆盖通用设置)。 | ${CMAKE_BINARY_DIR}/bin/debug |
CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE | Release 模式下可执行文件的输出目录(覆盖通用设置)。 | ${CMAKE_BINARY_DIR}/bin/release |
六、Qt 相关自动处理类
用于 Qt 项目中自动处理 moc(元对象编译器)、uic(UI 编译器)、rcc(资源编译器),简化 Qt 项目配置。
| 变量名 | 作用说明 | 取值类型 |
|---|---|---|
CMAKE_AUTOMOC | 自动运行 moc 处理 Qt 元对象代码(如 Q_OBJECT 宏)。 | 布尔值(ON/OFF) |
CMAKE_AUTOUIC | 自动运行 uic 处理 .ui 文件(Qt 设计器生成的 UI 文件)。 | 布尔值(ON/OFF) |
CMAKE_AUTORCC | 自动运行 rcc 处理 .qrc 资源文件。 | 布尔值(ON/OFF) |
CMAKE_INCLUDE_CURRENT_DIR | 自动将当前 CMakeLists.txt 所在目录添加到编译器的包含路径(便于 Qt 生成文件引用)。 | 布尔值(ON/OFF) |
七、其他常用功能类
用于控制构建流程的细节(如输出颜色、编译数据库等)。
| 变量名 | 作用说明 | 取值类型/示例 |
|---|---|---|
CMAKE_COLOR_MAKEFILE | 控制生成的 Makefile 是否支持彩色输出(提升构建日志可读性)。 | 布尔值(ON/OFF,默认 ON) |
CMAKE_EXPORT_COMPILE_COMMANDS | 生成 compile_commands.json 文件(用于 IDE 或工具解析编译选项,如 Clangd)。 | 布尔值(ON/OFF) |
CMAKE_VERBOSE_MAKEFILE | 控制 Makefile 构建时是否输出详细命令(调试构建流程用)。 | 布尔值(ON/OFF,默认 OFF) |
总结
CMake 的预定义内置变量是项目配置的“基础设施”,按用途可分为平台检测、路径管理、编译器配置、构建输出等类别。掌握这些变量的含义和用法,能帮助你更灵活地控制跨平台项目的构建流程,适配不同系统、编译器和构建需求。实际使用中,可通过 cmake --system-information 命令查看当前环境下所有预定义变量的取值。
1万+

被折叠的 条评论
为什么被折叠?



