cmake中宏中set参数的问题解惑

本文通过四个实例详细解析了CMake宏的使用方法,包括宏定义、变量传递与修改等内容,并对比了不同设置方式的效果。

先看一下关键字:cmake的宏是MACRO,用法:

macro(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)            # 命令语句
  COMMAND2(ARGS ...)
  ...
endmacro()

定义一个名称为name的宏(函数),arg1...是传入的参数。我们除了可以用${arg1}来引用变量以外,系统为我们提供了一些特殊的变量:

变量说明
argv##是一个下标,0指向第一个参数,累加
argv所有的定义时要求传入的参数
argn定义时要求传入的参数以外的参数
argc传入的实际参数的个数,也就是调用函数是传入的参数个数

CMakeLists.txt
例1:

cmake_minimum_required(VERSION 2.8)
set(var "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(arg "abc")
  message("# After change the value of arg.")
  message("arg = ${arg}")
endmacro()
message("=== Call macro ===")
Moo(${var})
message("outer arg = ${arg}")

运行结果:

=== Call macro ===
arg = ABC
# After change the value of arg.
arg = ABC
outer arg = abc

其余CMake的一些什么done信息我就省略了。

讲解:
其中设置set(arg “abc”)了,却没生效
查找了网上很多资料后才得知,macro(Moo arg)里面,会将${arg}的内容用实际传入宏的参数替换,set(arg “abc”)的作用只是设置了一个arg的变量,在最后一行打印出来的outer arg = abc就是这个set中arg的结果。

例2:

cmake_minimum_required(VERSION 2.8)
set(var "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(hi "abc")
  message("# After change the value of arg.")
  message("1.hi = ${hi}")
  message("2.hi = ${${hi}}")
endmacro()
message("=== Call macro ===")
Moo(${var})
message("outer hi = ${hi}")

运行结果:

=== Call macro ===
arg = ABC
# After change the value of arg.
1.hi = abc
2.hi = 
outer hi = abc

例1和例2来看,set(arg "abc")set(hi "abc") 都是设置了一个新的变量,在外部都打印出来了(最后一行)。唯一不同的是例子1中的set(arg "abc")这里的arg和macro(Moo arg) 中的长得一样 这个造成了我们理解的困难。

例子3:

cmake_minimum_required(VERSION 2.8)
set(var "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(${arg} "abc")
  message("# After change the value of arg.")
  message("1.arg = ${arg}")
  message("2.arg = ${${arg}}")
endmacro()
message("=== Call macro ===")
Moo(${var})
message("outer arg = ${arg}")

运行结果:

=== Call macro ===
arg = ABC
# After change the value of arg.
1.arg = ABC
2.arg = abc
outer arg = 

例3告诉我们要对macro(Moo arg)这里的arg进行重新设置,需要用set(${arg} "abc")这种方式,否则就不能达到我们的效果(和例子1进行对比得知)

message("1.arg = ${arg}")
message("2.arg = ${${arg}}")

1.arg = ABC
2.arg = abc

这个告诉我们,${arg}取到的值是macro(Moo arg)这里的,而${${arg}}的值是set(${arg} "abc")这里设置的。

例4:

cmake_minimum_required(VERSION 2.8)
set(var "ABC")

macro(Moo arg)
  message("arg = ${arg}")
  set(${hi} "abc")
  message("# After change the value of arg.")
  message("1.hi = ${hi}")
  message("2.hi = ${${hi}}")
endmacro()
message("=== Call macro ===")
Moo(${var})
message("outer hi = ${hi}")

运行结果:

=== Call macro ===
arg = ABC
# After change the value of arg.
1.hi = 
2.hi = 
outer hi = 

例4完全是为了和例子3进行对比,${hi}是完全不存在的一个变量,它的值是空,不能对他进行设置,也取不到它的值(取到的是空)。

最后对比例1和例3,这个才是容易让我们困惑的, set(arg "abc")set(${arg} "abc") 长得相似,结果却不同,记住这点是容易出错的地方。

【CMake】cmake中的include指令(.cmake文件/MACRO宏/function函数)

cmake中宏的使用

CMake 宏修改输出参数

<think> 首先,用户的问题是:“Cmake中的set作用”,翻译成中文是“CMake中的set作用”。我需要用中文回答这个问题。 关键点是:在回答后,必须提出3-5个相关问题。这些相关问题必须以“§§相关问题§§”开头,并且在一行中输出。然后列出1. 2. 3.等。 回顾规则: - 回答完问题后,必须输出“§§相关问题§§”在第一行。 - 禁止换行分散。意思是“§§相关问题§§”必须在一行,然后是列表。 - 相关问题基于用户的问题和我的回答。 首先,我需要回答“CMake中的set作用”。 在CMake中,`set`命令用于设置变量的值。它可以设置普通变量、缓存变量或环境变量。基本语法是: - `set(<variable> <value> [CACHE <type> <docstring> [FORCE]])` - 它可以用于定义变量,控制作用域(如PARENT_SCOPE),或设置缓存变量来在CMake缓存中存储值。 作用: 1. 定义或修改变量的值。 2. 设置缓存变量,用于用户可配置的选项。 3. 设置环境变量(使用ENV前缀)。 4. 控制变量的作用域,比如使用PARENT_SCOPE在父作用域中设置变量。 现在,构建回答: - 用中文解释。 - 保持简洁。 回答结构: 1. 解释`set`的基本作用。 2. 提供一些例子或关键点。 3. 结束回答。 然后,输出“§§相关问题§§”,接着列出3-5个相关问题。 相关问题必须基于用户的问题和我的回答。用户的问题是问“set作用”,所以我应该问一些相关的、扩展的问题,比如: - 如何使用`set`设置缓存变量? - `set`和`option`有什么区别? - 变量作用域在CMake中如何工作? - 如何设置环境变量? - 等等。 列出3-5个: 1. CMake中如何设置缓存变量? 2. `set`命令和`option`命令有什么区别? 3. 如何在CMake中控制变量的作用域? 4. 设置环境变量的方法是什么? 5. CMake中的变量类型有哪些? 确保格式: - 输出回答后。 - 第一行:"§§相关问题§§" - 然后列出1. 2. 3. 每个在单独行,但"§§相关问题§§"后不换行?规则说“禁止换行分散”,意思是“§§相关问题§§”必须在一行输出,不分散。所以可能是: "§§相关问题§§" 然后换行后列出问题。 示例格式是: ``` §§相关问题§§ 1. ··· 2. ··· 3. ··· ``` 所以,我应该在回答后写: "§§相关问题§§" 然后新行:"1. 问题1" "2. 问题2" 等。 现在,写回答。 中文回答: 在CMake中,`set`命令的主要作用是设置变量的值。它可以用于定义或修改普通变量、缓存变量或环境变量。具体来说: - 设置普通变量:`set(MY_VAR "value")` 在当前作用域中定义变量。 - 设置缓存变量:`set(MY_CACHE_VAR "default" CACHE STRING "Description")` 用于CMake缓存,允许用户通过GUI或命令行覆盖。 - 设置环境变量:`set(ENV{PATH} "/new/path:$ENV{PATH}")` 修改环境变量。 - 作用域控制:使用`PARENT_SCOPE`可以在父作用域中设置变量,例如在函数中设置变量后在调用者作用域可见。 然后,输出相关问题。 相关问题: 1. CMake中如何设置和使用缓存变量? 2. `set`命令与`option`命令在功能上有何区别? 3. 在CMake中,变量的作用域是如何管理的? 4. 如何使用`set`命令修改环境变量? 5. CMake中有哪些常见的变量类型和用途? 这有5个,可以保留。 确保所有内容符合规则。 </think>在CMake中,`set`命令的主要作用是设置变量的值,用于定义或修改变量,包括普通变量、缓存变量和环境变量。具体功能包括: - **定义普通变量**:在当前位置设置一个变量值,例如 `set(MY_VAR "Hello")`,这会创建一个新变量或覆盖现有变量。 - **设置缓存变量**:通过添加 `CACHE` 选项,将变量存储在CMake缓存中,用户可通过GUI或命令行修改,例如 `set(MY_CACHE_VAR "default" CACHE STRING "Description")`。 - **控制作用域**:使用 `PARENT_SCOPE` 关键字,在父作用域(如函数或的调用者)中设置变量,例如 `set(MY_VAR "Value" PARENT_SCOPE)`。 - **设置环境变量**:通过 `ENV` 前缀修改环境变量,例如 `set(ENV{PATH} "/new/path:$ENV{PATH}")`。 `set`是CMake变量管理的基础命令,常用于配置项目选项、传递参数或控制编译过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值