CMake: set 普通变量、全局变量

1.设置普通变量

set(<variable> <value>... [PARENT_SCOPE])
  • 如果value只有一个,将variable设为value
  • 如果没有value值,取消设置variable,和unset()效果一样
  • 父级目录设置的普通变量,子级目录可以访问,反之不行

2.设置缓存变量

set(<variable> <value>... CACHE <type> <docstring> [FORCE])
  • CACHE表明缓存,即全局变量,可以被所有的CMakeLists共享访问
  • docstring为变量说明,在cmake-gui中可以显示提示
  • 变量类型type可选下列值
    1. BOOL : 可选值为 ON\OFF,在cmake-gui中显示为一个可选框
    2. FILEPATH:文件位置路径,在cmake-gui中显示为一个文件路径框
    3. PATH:文件夹位置路径,在cmake-gui中显示为一个文件路径框
    4. STRING:一行文本,在cmake-gui中显示为一个文本框或者一个下拉的选择框
    5. INTERNAL:一行文本,在cmake-gui中不显示,表示在整个运行过程中值保持恒定

3.清除缓存变量

如果增加了一个CACHE后,想删掉,直接删除CmakeCache.txt文件是不行的,在cmake-gui中仍然会有缓存。

正确的做法是CMake-Gui->File->Delete Cache,之后将CmakeLists.txt中需要删除的Cache变量删除,再执行Cmake-gui,此变量就不会在gui中显示了。

<think>好的,用户现在问的是如何在CMake中强制设置变量值。之前他们询问了如何判断操作系统,现在可能是在构建过程中遇到了需要覆盖某些变量默认值的情况。我需要先回忆一下CMake变量作用域和设置方法。 首先,用户可能知道CMake中的set命令,但可能遇到了变量被覆盖的问题,或者需要确保变量不被后续的代码修改。这时候强制设置变量就显得重要了。我需要解释如何通过set命令的不同选项来实现强制设置,比如FORCE参数。 接下来,用户可能需要了解普通设置和强制设置的区别。比如,普通set命令如果在父作用域已经存在同名变量,可能不会覆盖,而使用FORCE则可以。这时候需要举例子说明,比如在函数或子目录中设置变量时的情况。 另外,用户可能还想知道缓存变量普通变量的区别。使用CACHE选项可以将变量保存到CMake缓存中,这样即使在多次生成构建系统时也能保持值不变。这时候需要解释CACHE和FORCE一起使用的情况,比如在命令行中通过-D选项设置的变量如何被覆盖。 还可能要考虑作用域的问题,比如全局变量和局部变量。用户可能在某个子目录中设置了变量,但希望在整个项目中强制使用某个值。这时候可能需要结合PARENT_SCOPE来提升变量的作用域,但要注意这可能与FORCE的使用场景不同。 另外,用户可能遇到的常见问题包括变量被意外覆盖,或者在多个地方定义同一个变量导致行为不一致。这时候需要强调FORCE参数的作用,以及如何谨慎使用它,避免引入难以调试的问题。 需要给出示例代码,比如使用set(VAR VALUE CACHE TYPE FORCE)来强制覆盖缓存变量,或者普通变量使用FORCE的情况。同时提醒用户,强制设置可能会影响其他部分的代码,需谨慎使用。 最后,总结不同方法的适用场景,比如需要跨作用域覆盖变量时使用FORCE,或者在缓存中永久设置变量时结合CACHE和FORCE。可能还需要提到策略设置,比如CMake的策略如何影响变量的行为,但可能这属于高级话题,暂时不需要深入。 总之,我需要结构清晰地从基本命令开始,解释不同设置方式,强调FORCE的作用和适用情况,并提供示例和注意事项,确保用户能够正确使用强制设置变量的方法,避免常见陷阱。</think>在 CMake 中,**强制设置变量值**通常用于覆盖已有变量(包括缓存变量或父作用域变量),确保变量的值不被其他逻辑修改。以下是几种常见方法及使用场景: --- ### 方法一:使用 `set(... FORCE)` 通过 `FORCE` 参数强制覆盖变量的当前值(即使该变量已存在或被缓存)。 #### 语法 ```cmake set(<变量名> <值> CACHE <类型> FORCE) # 强制覆盖缓存变量 set(<变量名> <值> PARENT_SCOPE) # 强制修改父作用域的变量(需配合函数使用) set(<变量名> <值> FORCE) # 强制覆盖普通变量(非缓存变量) ``` #### 示例 ```cmake # 强制覆盖缓存变量(例如:覆盖用户通过命令行传入的默认值) set(MY_VAR "forced_value" CACHE STRING "Description" FORCE) # 强制设置普通变量(忽略父作用域的变量值) set(MY_LOCAL_VAR "forced_local_value" FORCE) ``` --- ### 方法二:结合 `CACHE` 和 `FORCE` 通过 `CACHE` 和 `FORCE` 的联合使用,可以将变量写入 CMake 缓存文件(`CMakeCache.txt`),并确保其值不会被后续代码覆盖。 #### 示例 ```cmake # 强制设置缓存变量,即使该变量已存在 set(ENABLE_FEATURE ON CACHE BOOL "Enable a feature" FORCE) ``` --- ### 方法三:通过命令行强制覆盖 在运行 CMake 时通过 `-D` 参数直接强制设置变量值(优先级最高): ```bash cmake -B build -DMY_VAR:STRING="forced_value" # 强制覆盖变量 ``` --- ### 不同场景的强制设置 #### 1. **覆盖父作用域的变量** ```cmake function(my_function) set(MY_VAR "new_value" PARENT_SCOPE) # 修改父作用域的变量 endfunction() my_function() message(STATUS "MY_VAR = ${MY_VAR}") # 输出: MY_VAR = new_value ``` #### 2. **强制覆盖缓存变量** ```cmake # 即使缓存中已有 MY_CACHE_VAR,也会被强制覆盖 set(MY_CACHE_VAR "default" CACHE STRING "A cache variable") set(MY_CACHE_VAR "forced" CACHE STRING "A cache variable" FORCE) ``` #### 3. **忽略条件判断** ```cmake if(DEFINED MY_VAR) # 即使 MY_VAR 已定义,仍强制修改 set(MY_VAR "forced_value" FORCE) endif() ``` --- ### 注意事项 1. **慎用 `FORCE`** 强制覆盖变量可能导致不可预期的行为,尤其是在大型项目中,可能破坏其他模块的依赖逻辑。 2. **缓存变量 vs 普通变量** - `CACHE` 变量会被持久化到 `CMakeCache.txt` 中。 - 普通变量的 `FORCE` 仅在当前作用域有效。 3. **命令行优先级** 通过 `-D` 设置的变量优先级高于 CMake 脚本中的 `set(... CACHE ... FORCE)`。 --- ### 示例:强制指定编译器 ```cmake # 强制使用 GCC(即使系统有其他编译器) set(CMAKE_C_COMPILER "/usr/bin/gcc" CACHE FILEPATH "C compiler" FORCE) set(CMAKE_CXX_COMPILER "/usr/bin/g++" CACHE FILEPATH "C++ compiler" FORCE) ``` --- 通过合理使用强制设置,可以在特定场景下确保 CMake 变量值的确定性,但需谨慎权衡其必要性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值