CMake中function函数的定义:
function(<name> [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...) # 命令语句
COMMAND2(ARGS ...)
...
function()
系统为我们提供了一些特殊的变量:
变量 | 说明 |
---|---|
argv# | #是一个下标,0指向第一个参数,累加 |
argv | 所有的定义时要求传入的参数 |
argn | 定义时要求传入的参数以外的参数 |
argc | 传入的实际参数的个数,也就是调用函数是传入的参数个数 |
函数就是使用变量,在命令中途可以对改变量进行修改
例一:
cmake_minimum_required(VERSION 3.5)
set(var "ABC")
function(Foo arg)
message("arg = ${arg}")
set(arg "abc")
message("# After change the value of arg.")
message("arg = ${arg}")
endfunction()
message("=== Call function ===")
Foo(${var})
message("outer arg = ${arg}")
message("var = ${var}")
运行结果:
=== Call function ===
arg = ABC
# After change the value of arg.
arg = abc
outer arg =
var = ABC
例二:
cmake_minimum_required(VERSION 3.5)
set(var "ABC")
function(Foo arg)
message("arg = ${arg}")
set(arg "abc")
message("# After change the value of arg.")
message("arg = ${arg}")
endfunction()
message("=== Call function ===")
Foo(var)
message("outer arg = ${arg}")
message("var = ${var}")
运行结果:
=== Call function ===
arg = var
# After change the value of arg.
arg = abc
outer arg =
var = ABC
例三:
cmake_minimum_required(VERSION 3.5)
set(var "ABC")
function(Foo arg)
if (arg STREQUAL "ABC")
message("arg1 = ${arg}")
endif()
if (${arg} STREQUAL "ABC")
message("arg2 = ${arg}")
endif()
endfunction()
message("=== Call function ===")
Foo(${var})
message("outer arg = ${arg}")
message("var = ${var}")
运行结果:
=== Call function ===
arg1 = ABC
arg2 = ABC
outer arg =
var = ABC
- 对于CMake中的function函数,当调用的时候如果使用的是set出来的变量,都必须通过
${}
将变量的内容传递进去,而不能只写上变量名。举例:Foo(${var})
- CMake中的function函数,参数传递是值拷贝的方式,在命令中途可以对改变量进行修改(因为是单向值传递,仅在函数的作用域内生效,例如最后一行的
message("var = ${var}")
中的var值还是ABC
)。 - CMake中的function函数可通过
${}
取出内容,也可以直接通过变量名取出内容。例如在函数内的
if (arg STREQUAL "ABC")
message("arg1 = ${arg}")
endif()
if (${arg} STREQUAL "ABC")
message("arg2 = ${arg}")
endif()
这两句是等效的。
如果把CMake中的宏和函数对比起来看的话,就会出现让人迷惑的地方,下一篇我们将CMake中的宏和函数进行对比,看看它们的差异。