CMake 常用内置变量说明
一、路径相关变量
CMAKE_SOURCE_DIR
中文: 顶层源码目录
说明: 最顶层CMakeLists.txt所在的目录(项目根目录)
示例: C:/Users/Administrator/Desktop/demo
CMAKE_BINARY_DIR
中文: 顶层构建目录
说明: 运行cmake命令的build目录(最顶层)
示例: C:/Users/Administrator/Desktop/demo/build
CMAKE_CURRENT_SOURCE_DIR
中文: 当前源码目录
说明: 当前正在处理的CMakeLists.txt所在目录
示例: C:/Users/Administrator/Desktop/demo/s1
CMAKE_CURRENT_BINARY_DIR
中文: 当前构建目录
说明: 当前CMakeLists.txt对应的build目录
示例: C:/Users/Administrator/Desktop/demo/build/s1
CMAKE_CURRENT_LIST_DIR
中文: 当前文件目录
说明: 当前正在处理的CMakeLists.txt文件所在目录(与CMAKE_CURRENT_SOURCE_DIR类似)
示例: C:/Users/Administrator/Desktop/demo/s1
CMAKE_CURRENT_LIST_FILE
中文: 当前文件完整路径
说明: 正在处理的CMakeLists.txt的完整路径
示例: C:/Users/Administrator/Desktop/demo/s1/CMakeLists.txt
CMAKE_MODULE_PATH
中文: 模块搜索路径
说明: CMake查找模块文件(*.cmake)的路径列表
示例: set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
PROJECT_SOURCE_DIR
中文: 项目源码目录
说明: 最近一次调用project()命令的CMakeLists.txt所在目录
示例: C:/Users/Administrator/Desktop/demo/s1
PROJECT_BINARY_DIR
中文: 项目构建目录
说明: 对应PROJECT_SOURCE_DIR的构建目录
示例: C:/Users/Administrator/Desktop/demo/build/s1
PROJECT_NAME
中文: 项目名称
说明: 最近一次调用project()设置的项目名
示例: s1_exe
二、输出目录变量
CMAKE_RUNTIME_OUTPUT_DIRECTORY
中文: 运行时文件输出目录
说明: 可执行文件(.exe)和DLL(.dll)的输出位置
示例: ${CMAKE_SOURCE_DIR}/.../output
CMAKE_LIBRARY_OUTPUT_DIRECTORY
中文: 库文件输出目录
说明: 共享库(.so, .dylib)和模块(.dll)的输出位置
示例: ${CMAKE_SOURCE_DIR}/.../output/lib
CMAKE_ARCHIVE_OUTPUT_DIRECTORY
中文: 归档文件输出目录
说明: 静态库(.a, .lib)的输出位置
示例: ${CMAKE_SOURCE_DIR}/.../output/lib
CMAKE_RUNTIME_OUTPUT_DIRECTORY_
中文: 特定配置的运行时输出目录
说明: 为Debug/Release等配置单独设置输出目录
示例: CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG
CMAKE_LIBRARY_OUTPUT_DIRECTORY_
中文: 特定配置的库文件输出目录
说明: 为Debug/Release等配置单独设置库输出目录
示例: CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_
中文: 特定配置的归档文件输出目录
说明: 为Debug/Release等配置单独设置静态库输出目录
示例: CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG
三、编译器和工具链变量
CMAKE_C_COMPILER
中文: C编译器路径
说明: 使用的C编译器完整路径
示例: C:/Program Files/Microsoft Visual Studio/VC/bin/cl.exe
CMAKE_CXX_COMPILER
中文: C++编译器路径
说明: 使用的C++编译器完整路径
示例: C:/Program Files/Microsoft Visual Studio/VC/bin/cl.exe
CMAKE_C_COMPILER_ID
中文: C编译器标识
说明: 编译器的ID名称
可能值: MSVC, GNU, Clang, AppleClang
CMAKE_CXX_COMPILER_ID
中文: C++编译器标识
说明: C++编译器的ID名称
可能值: MSVC, GNU, Clang, AppleClang
CMAKE_C_STANDARD
中文: C语言标准版本
说明: 设置C语言标准(C90, C99, C11等)
示例: set(CMAKE_C_STANDARD 11)
CMAKE_CXX_STANDARD
中文: C++语言标准版本
说明: 设置C++语言标准(C++11, C++14, C++17, C++20等)
示例: set(CMAKE_CXX_STANDARD 17)
CMAKE_C_STANDARD_REQUIRED
中文: 是否强制要求C标准
说明: 如果编译器不支持指定标准,是否报错
示例: set(CMAKE_C_STANDARD_REQUIRED ON)
CMAKE_CXX_STANDARD_REQUIRED
中文: 是否强制要求C++标准
说明: 如果编译器不支持指定标准,是否报错
示例: set(CMAKE_CXX_STANDARD_REQUIRED ON)
CMAKE_C_EXTENSIONS
中文: 是否启用C编译器扩展
说明: 是否使用编译器特定的语言扩展
示例: set(CMAKE_C_EXTENSIONS OFF)
CMAKE_CXX_EXTENSIONS
中文: 是否启用C++编译器扩展
说明: 是否使用编译器特定的语言扩展
示例: set(CMAKE_CXX_EXTENSIONS OFF)
CMAKE_C_FLAGS
中文: C编译选项
说明: 传递给C编译器的额外标志
示例: set(CMAKE_C_FLAGS "-Wall -O2")
CMAKE_CXX_FLAGS
中文: C++编译选项
说明: 传递给C++编译器的额外标志
示例: set(CMAKE_CXX_FLAGS "-Wall -std=c++17")
CMAKE_C_FLAGS_DEBUG
中文: C Debug编译选项
说明: Debug配置下的C编译选项
示例: set(CMAKE_C_FLAGS_DEBUG "-g -O0")
CMAKE_CXX_FLAGS_DEBUG
中文: C++ Debug编译选项
说明: Debug配置下的C++编译选项
示例: set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
CMAKE_C_FLAGS_RELEASE
中文: C Release编译选项
说明: Release配置下的C编译选项
示例: set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
CMAKE_CXX_FLAGS_RELEASE
中文: C++ Release编译选项
说明: Release配置下的C++编译选项
示例: set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
四、构建类型和配置
CMAKE_BUILD_TYPE
中文: 构建类型
说明: 单配置生成器(如Makefile)的构建类型
可能值: Debug, Release, RelWithDebInfo, MinSizeRel
示例: set(CMAKE_BUILD_TYPE Release)
CMAKE_CONFIGURATION_TYPES
中文: 配置类型列表
说明: 多配置生成器(如Visual Studio)支持的配置类型
默认值: Debug;Release;MinSizeRel;RelWithDebInfo
示例: set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
CMAKE_BUILD_SHARED_LIBS
中文: 是否构建共享库
说明: 控制add_library()默认生成共享库还是静态库
示例: set(BUILD_SHARED_LIBS ON)
五、系统和平台变量
CMAKE_SYSTEM
中文: 完整系统名称
说明: 操作系统和版本的完整描述
示例: Windows-10.0.19045
CMAKE_SYSTEM_NAME
中文: 系统名称
说明: 操作系统名称
可能值: Windows, Linux, Darwin(macOS), Android
CMAKE_SYSTEM_VERSION
中文: 系统版本
说明: 操作系统版本号
示例: 10.0.19045
CMAKE_SYSTEM_PROCESSOR
中文: 处理器架构
说明: CPU架构类型
可能值: x86_64, AMD64, ARM, aarch64
WIN32
中文: 是否为Windows系统
说明: 在Windows平台上为TRUE
示例: if(WIN32) ... endif()
UNIX
中文: 是否为Unix-like系统
说明: 在Linux/macOS/BSD等平台为TRUE
示例: if(UNIX) ... endif()
APPLE
中文: 是否为苹果系统
说明: 在macOS/iOS等平台为TRUE
示例: if(APPLE) ... endif()
MSVC
中文: 是否为MSVC编译器
说明: 使用Microsoft Visual C++编译器时为TRUE
示例: if(MSVC) ... endif()
MINGW
中文: 是否为MinGW环境
说明: 使用MinGW工具链时为TRUE
示例: if(MINGW) ... endif()
CMAKE_SIZEOF_VOID_P
中文: 指针大小(字节)
说明: 用于判断32位还是64位系统
可能值: 4(32位), 8(64位)
示例: if(CMAKE_SIZEOF_VOID_P EQUAL 8) # 64位系统
六、生成器相关变量
CMAKE_GENERATOR
中文: CMake生成器名称
说明: 当前使用的生成器
示例: Visual Studio 17 2022, Unix Makefiles, Ninja
CMAKE_GENERATOR_PLATFORM
中文: 生成器平台
说明: Visual Studio生成器的目标平台
可能值: Win32, x64, ARM, ARM64
CMAKE_GENERATOR_TOOLSET
中文: 生成器工具集
说明: Visual Studio生成器使用的工具集版本
示例: v143, v142
CMAKE_MAKE_PROGRAM
中文: Make程序路径
说明: 实际执行构建的程序(如make, ninja, msbuild)
示例: C:/Program Files/CMake/bin/ninja.exe
七、项目信息变量
PROJECT_VERSION
中文: 项目版本号
说明: project()命令中指定的VERSION
示例: project(MyApp VERSION 1.2.3)
PROJECT_VERSION_MAJOR
中文: 项目主版本号
说明: 版本号的第一部分
示例: 1 (从1.2.3中提取)
PROJECT_VERSION_MINOR
中文: 项目次版本号
说明: 版本号的第二部分
示例: 2 (从1.2.3中提取)
PROJECT_VERSION_PATCH
中文: 项目补丁版本号
说明: 版本号的第三部分
示例: 3 (从1.2.3中提取)
PROJECT_DESCRIPTION
中文: 项目描述
说明: project()命令中指定的DESCRIPTION
示例: project(MyApp DESCRIPTION "My Application")
PROJECT_HOMEPAGE_URL
中文: 项目主页URL
说明: project()命令中指定的HOMEPAGE_URL
示例: project(MyApp HOMEPAGE_URL "https://example.com")
八、链接和依赖变量
CMAKE_INCLUDE_PATH
中文: 头文件搜索路径
说明: find_file()和find_path()的搜索路径
示例: set(CMAKE_INCLUDE_PATH "/usr/local/include")
CMAKE_LIBRARY_PATH
中文: 库文件搜索路径
说明: find_library()的搜索路径
示例: set(CMAKE_LIBRARY_PATH "/usr/local/lib")
CMAKE_PREFIX_PATH
中文: 前缀搜索路径
说明: find_package()等命令的搜索路径前缀
示例: set(CMAKE_PREFIX_PATH "C:/libs")
CMAKE_FIND_ROOT_PATH
中文: 根搜索路径
说明: 交叉编译时的根文件系统路径
示例: set(CMAKE_FIND_ROOT_PATH "/opt/cross-toolchain")
CMAKE_INSTALL_PREFIX
中文: 安装路径前缀
说明: make install时的安装目标目录
默认值(Windows): C:/Program Files/${PROJECT_NAME}
默认值(Unix): /usr/local
示例: set(CMAKE_INSTALL_PREFIX "/opt/myapp")
九、其他常用变量
CMAKE_VERBOSE_MAKEFILE
中文: 是否显示详细构建信息
说明: 是否显示完整的编译命令
示例: set(CMAKE_VERBOSE_MAKEFILE ON)
CMAKE_COLOR_MAKEFILE
中文: 是否使用彩色输出
说明: Makefile生成器是否使用彩色输出
示例: set(CMAKE_COLOR_MAKEFILE ON)
CMAKE_EXPORT_COMPILE_COMMANDS
中文: 是否导出编译命令
说明: 生成compile_commands.json文件(用于IDE和工具)
示例: set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
CMAKE_POSITION_INDEPENDENT_CODE
中文: 是否生成位置无关代码
说明: 为所有目标启用PIC(-fPIC)
示例: set(CMAKE_POSITION_INDEPENDENT_CODE ON)
CMAKE_SKIP_BUILD_RPATH
中文: 是否跳过构建时的RPATH
说明: 构建时不设置RPATH(Unix)
示例: set(CMAKE_SKIP_BUILD_RPATH TRUE)
CMAKE_INSTALL_RPATH
中文: 安装时的RPATH
说明: 安装后可执行文件的运行时库搜索路径
示例: set(CMAKE_INSTALL_RPATH "$ORIGIN/.../lib")
BUILD_TESTING
中文: 是否构建测试
说明: 是否启用测试功能(需要enable_testing())
示例: set(BUILD_TESTING OFF)
十、目标属性相关变量(用于target)
CMAKE__COMPILE_FEATURES
中文: 编译器支持的特性列表
说明: 当前编译器支持的语言特性
示例: CMAKE_CXX_COMPILE_FEATURES
CMAKE__COMPILER_VERSION
中文: 编译器版本
说明: 当前使用的编译器版本号
示例: CMAKE_CXX_COMPILER_VERSION
CMAKE__POSTFIX
中文: 配置后缀
说明: 为不同配置的目标文件添加后缀
示例: set(CMAKE_DEBUG_POSTFIX "_d")
EXECUTABLE_OUTPUT_PATH (已弃用)
中文: 可执行文件输出路径(旧版本)
说明: 已被CMAKE_RUNTIME_OUTPUT_DIRECTORY替代
建议: 使用CMAKE_RUNTIME_OUTPUT_DIRECTORY
LIBRARY_OUTPUT_PATH (已弃用)
中文: 库文件输出路径(旧版本)
说明: 已被CMAKE_LIBRARY_OUTPUT_DIRECTORY替代
建议: 使用CMAKE_LIBRARY_OUTPUT_DIRECTORY
使用技巧
-
查看变量值:
message(STATUS "CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
-
打印所有变量:
get_cmake_property(_vars VARIABLES)
foreach(_var v a r s ) m e s s a g e ( S T A T U S " {_vars}) message(STATUS " vars)message(STATUS"{_var} = KaTeX parse error: Expected '}', got 'EOF' at end of input: {{_var}}")
endforeach()
-
判断变量是否定义:
if(DEFINED MY_VARIABLE)
message("变量已定义")
endif()
-
设置缓存变量:
set(MY_VAR "value" CACHE STRING "描述" FORCE)
-
使用环境变量:
set(MY_PATH $ENV{PATH})