CMake ARGV变量使用指南
在 CMake 中,ARGV
是一个特殊的变量,用于在 函数(function) 或 宏(macro) 内部访问所有传入的参数。它的作用类似于 C/C++ 中的 argv[]
,用于处理可变数量的参数。
核心作用
-
获取所有参数
ARGV
是一个 列表(list),包含调用函数/宏时传入的所有参数。 -
与
ARGN
的区别ARGV
:包含所有传入的参数(包括已命名的形参和额外参数)。ARGN
:仅包含超出形参数量的额外参数(即未在函数声明中列出的参数)。
使用示例
定义函数
function(print_all_args)# 打印所有参数(ARGV 是列表)message("All arguments: ${ARGV}")# 遍历每个参数foreach(arg IN LISTS ARGV)message("Argument: ${arg}")endforeach()
endfunction()
调用函数
print_all_args(apple banana cherry)
输出
All arguments: apple;banana;cherry
Argument: apple
Argument: banana
Argument: cherry
典型场景
1. 处理可变参数
当函数需要接受不确定数量的参数时(如自定义包装器):
function(create_targets)foreach(target IN LISTS ARGV)add_executable(${target} "${target}.cpp")endforeach()
endfunction()# 一次性创建多个目标
create_targets(app1 app2 app3)
2. 解析复杂参数
结合 cmake_parse_arguments
解析选项和关键字:
function(setup_project)# 解析选项(如 OPTION_FOO)、单值参数(如 SINGLE_VAL)和多值参数(如 MULTI_VAL)set(options OPTION_FOO)set(oneValueArgs SINGLE_VAL)set(multiValueArgs MULTI_VAL)cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGV})# 使用解析后的结果if(ARG_OPTION_FOO)message("Option FOO is enabled")endif()
endfunction()# 调用示例
setup_project(OPTION_FOO SINGLE_VAL hello MULTI_VAL a b c)
注意事项
-
作用域限制
ARGV
和ARGN
仅在函数或宏内部有效,不能在外部使用。 -
参数分隔符
CMake 中参数以分号;
分隔。当打印${ARGV}
时,会显示为arg1;arg2;arg3
。 -
索引访问
可通过${ARGV0}
,${ARGV1}
, … 访问特定位置的参数(索引从0
开始):message("First arg: ${ARGV0}") # 第一个参数
总结
变量 | 含义 | 作用域 |
---|---|---|
ARGV | 函数/宏的所有传入参数 | 函数/宏内部 |
ARGN | 超出声明形参的额外参数 | 函数/宏内部 |
ARGVx | 第 x 个参数(如 ${ARGV2} ) | 函数/宏内部 |
通过 ARGV
,你可以灵活处理 CMake 中的可变参数,实现更动态的构建逻辑。