先看一下关键字: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")
长得相似,结果却不同,记住这点是容易出错的地方。