在 CMake 中,function
用于定义一个可复用的代码块,可以在 CMake 脚本中多次调用。它类似于其他编程语言中的函数。函数内的变量默认是局部的,不会影响外部的变量,除非显式地使用 PARENT_SCOPE
来修改父级作用域中的变量。
基本语法
function(<name> [arg1 arg2 ...])# Function body
endfunction()
<name>
: 函数名。[arg1 arg2 ...]
: 函数的参数,可以是零个或多个。- 函数体: 包含要执行的 CMake 命令。
示例 1:定义一个简单的函数
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 定义一个打印消息的函数
function(print_message message)message(STATUS "Message: ${message}")
endfunction()# 调用函数
print_message("Hello, CMake!")
在这个例子中,我们定义了一个名为 print_message
的函数,它接收一个参数 message
,然后打印出来。当调用 print_message("Hello, CMake!")
时,CMake 会输出 Message: Hello, CMake!
。
示例 2:函数内修改变量的作用域
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 定义一个修改变量值的函数
function(change_variable)set(MY_VAR "Modified Inside Function")
endfunction()# 调用函数之前
message(STATUS "MY_VAR before: ${MY_VAR}")# 调用函数
change_variable()# 调用函数之后
message(STATUS "MY_VAR after: ${MY_VAR}")
在这个例子中,MY_VAR
在函数内部被修改,但由于函数内的变量是局部的,函数外部的 MY_VAR
不受影响,输出将会是:
MY_VAR before:
MY_VAR after:
示例 3:使用 PARENT_SCOPE
修改父级作用域中的变量
如果你想在函数内修改外部作用域中的变量,可以使用 PARENT_SCOPE
:
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 定义一个修改父级作用域中变量的函数
function(change_variable_in_parent_scope)set(MY_VAR "Modified in Parent Scope" PARENT_SCOPE)
endfunction()# 调用函数之前
message(STATUS "MY_VAR before: ${MY_VAR}")# 调用函数
change_variable_in_parent_scope()# 调用函数之后
message(STATUS "MY_VAR after: ${MY_VAR}")
在这个例子中,函数 change_variable_in_parent_scope
修改了 MY_VAR
,并使用 PARENT_SCOPE
将更改传递到父级作用域。输出将会是:
MY_VAR before:
MY_VAR after: Modified in Parent Scope
示例 4:函数返回值
CMake 的 function
本身并没有返回值的概念,但可以通过设置一个变量来模拟返回值:
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 定义一个模拟返回值的函数
function(get_square value)math(EXPR result "${value} * ${value}")set(${ARGV0} ${result} PARENT_SCOPE) # 将结果传递给父级作用域的变量
endfunction()# 调用函数并获取结果
get_square(4 RESULT)# 打印结果
message(STATUS "Square of 4 is: ${RESULT}")
在这个例子中,函数 get_square
接收一个数字并计算其平方,然后通过 PARENT_SCOPE
将结果返回。结果会被赋值给变量 RESULT
,并在输出中显示 Square of 4 is: 16
。
示例 5:函数内的多参数
CMake 的函数可以接收多个参数。你可以通过 ARGN
访问所有的附加参数:
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 定义一个接收多个参数的函数
function(print_all_args)message(STATUS "Number of arguments: ${ARGC}")foreach(arg IN LISTS ARGN)message(STATUS "Argument: ${arg}")endforeach()
endfunction()# 调用函数
print_all_args("Hello" "CMake" "Function" "Example")
输出会是:
Number of arguments: 4
Argument: Hello
Argument: CMake
Argument: Function
Argument: Example
小结
- 基本使用:
function
用于定义一个可复用的代码块。 - 变量作用域: 默认情况下,函数内部的变量是局部的,使用
PARENT_SCOPE
可以将修改传递到父级作用域。 - 返回值模拟: CMake 没有内建的返回值机制,但可以通过设置外部变量来实现类似功能。
- 多参数支持: 使用
ARGV0
、ARGN
和ARGC
可以方便地处理多个输入参数。
这些例子涵盖了 CMake 中 function
的常见使用方式。