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( |
删除在当前作用域(如函数内、当前CMakeLists.txt)定义的普通变量。不加 CACHE。 |
| 删除缓存变量 | unset( |
必须加上 CACHE 关键字,从 CMake 的缓存中删除该变量,使其在下次配置时恢复默认或可重新设置。 |
3.2.3 范例:
- 删除普通变量
# 设置一个普通变量
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()
- 删除缓存变量
缓存变量(通过 -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)
# 删除后,该变量将不再存在于缓存中

浙公网安备 33010602011771号