CMake 相关变量总结(在工作中需要使用的)

1. 编译选项相关的:

1.1. CMAKE_CXX_EXTENSIONS

CMAKE_CXX_EXTENSIONS 是 CMake 中一个重要的编译选项控制变量,用于控制是否启用编译器特定的 C++ 扩展。

1.1.1 范例:

# 设置示例
set(CMAKE_CXX_EXTENSIONS OFF)  # 使用标准C++
# 或
set(CMAKE_CXX_EXTENSIONS ON)   # 使用GNU扩展(默认)

1.1.2 主要区别

当设置为 OFF 时:
使用严格的标准 C++ 模式
例如:-std=c++11, -std=c++14, -std=c++17
禁用编译器特有的非标准扩展
提高代码可移植性
当设置为 ON 时(默认):
使用 GNU 扩展模式

例如:-std=gnu++11, -std=gnu++14, -std=gnu++17
启用编译器特有的扩展
可能降低代码可移植性
实际影响示例
假设有以下代码:


#include <stdio.h>
#include <bits/stdc++.h>  // GCC特有头文件

int main() {
    int x = 5;
    printf("%d\n", x);
    return 0;
}

CMAKE_CXX_EXTENSIONS ON:可能编译通过,CMAKE_CXX_EXTENSIONS OFF:可能报错,因为 <bits/stdc++.h> 不是标准头文件

2. cmake 内部模块:

2.1 CMakeDependentOption

CMakeDependentOption 是 CMake 的一个模块,提供 cmake_dependent_option() 宏,用于创建依赖于其他变量状态的选项。这在配置复杂构建选项时非常有用。

2.1.1 基本语法

include(CMakeDependentOption)

cmake_dependent_option(
    <option_name>
    "<description>"
    <default_value>
    "<condition>"
    <forced_value>
)

参数详解
option_name: 要定义的选项变量名
description: 选项的描述文本
default_value: 当条件满足时的默认值(ON/OFF)
condition: 依赖的条件表达式(字符串)
forced_value: 条件不满足时的强制值(通常为 OFF)

2.1.2 主要要点:

1.普通变量优先级高于缓存变量
2.cmake_dependent_option 创建的是缓存变量
3.如果已经存在同名普通变量,它会"遮蔽"缓存变量
4.要避免在 cmake_dependent_option 之前用 set() 创建同名普通变量
5.condition: 依赖的条件表达式(字符串),一定要加"" , 切记切记!!!!!

3. CMake 关键字

3.1 COMMOAND

主要用法 含义 使用场景示例
if (COMMAND ) 检查名为 的函数、宏或命令是否已被定义 if (COMMAND set_up_hermetic_build)
在构建命令中) 在 add_custom_command() 或 add_custom_target() 中,定义需要执行的具体命令 add_custom_command(COMMAND echo "Building...")

3.2 unset

3.2.1 用法

在 CMake 中,unset 命令用于从当前作用域中删除一个变量,使其变为未定义状态。这在清理变量、重置构建选项或解决变量冲突时非常有用。

3.2.2 场景:

功能 语法 关键区别与说明
删除普通变量 unset( [CACHE]) 删除在当前作用域(如函数内、当前CMakeLists.txt)定义的普通变量。不加 CACHE。
删除缓存变量 unset( CACHE) 必须加上 CACHE 关键字,从 CMake 的缓存中删除该变量,使其在下次配置时恢复默认或可重新设置。

3.2.3 范例:

  1. 删除普通变量
# 设置一个普通变量
set(MY_VAR "Hello World")
message("删除前: MY_VAR = ${MY_VAR}") # 输出: Hello World

# 删除这个变量
unset(MY_VAR)

# 再次尝试访问,变量未定义
message("删除后: MY_VAR = ${MY_VAR}") # 输出: MY_VAR =
if(DEFINED MY_VAR)
    message("变量 MY_VAR 存在")
else()
    message("变量 MY_VAR 不存在") # 会执行这一句
endif()

  1. 删除缓存变量
    缓存变量(通过 -D 命令行选项或 set(... CACHE ...) 设置)需要使用 CACHE 关键字来删除。
# 假设通过命令行设置了: cmake -DMY_CACHE_VAR=ON ..

# 或者,在CMakeLists.txt中设置一个缓存变量
set(MY_CACHE_VAR "InitialValue" CACHE STRING "A sample cache variable")

# 删除这个缓存变量
unset(MY_CACHE_VAR CACHE)

# 删除后,该变量将不再存在于缓存中

posted @ 2026-01-23 10:29  退休人生  阅读(1)  评论(0)    收藏  举报