当前位置: 首页 > news >正文

CMake ARGV变量使用指南

在 CMake 中,ARGV 是一个特殊的变量,用于在 函数(function)宏(macro) 内部访问所有传入的参数。它的作用类似于 C/C++ 中的 argv[],用于处理可变数量的参数。


核心作用

  1. 获取所有参数
    ARGV 是一个 列表(list),包含调用函数/宏时传入的所有参数。

  2. 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)

注意事项

  1. 作用域限制
    ARGVARGN 仅在函数或宏内部有效,不能在外部使用。

  2. 参数分隔符
    CMake 中参数以分号 ; 分隔。当打印 ${ARGV} 时,会显示为 arg1;arg2;arg3

  3. 索引访问
    可通过 ${ARGV0}, ${ARGV1}, … 访问特定位置的参数(索引从 0 开始):

    message("First arg: ${ARGV0}")  # 第一个参数
    

总结

变量含义作用域
ARGV函数/宏的所有传入参数函数/宏内部
ARGN超出声明形参的额外参数函数/宏内部
ARGVxx 个参数(如 ${ARGV2}函数/宏内部

通过 ARGV,你可以灵活处理 CMake 中的可变参数,实现更动态的构建逻辑。

http://www.lryc.cn/news/598752.html

相关文章:

  • 基于C语言的Zynq SOC FPGA嵌入式裸机设计和开发教程
  • 外企本土化布局对国内连接器企业影响几何?
  • 模型的存储、加载和部署
  • rust-切片类型
  • centos7中把nginx更新到1.26 版(centos7默认只能更新到1.20)
  • IROS-2025 | OIKG:基于观察-图交互与关键细节引导的视觉语言导航
  • 【LeetCode 热题 100】39. 组合总和——(解法一)选或不选
  • windwos11网页切换残留/卡屏/冻结/残影问题
  • Java学习---Spring及其衍生(下)
  • 基于SpringBoot+Vue的电脑维修管理系统(WebSocket实时聊天、Echarts图形化分析)
  • 类和包的可见性
  • 磁性材料如何破解服务器电源高频损耗难题?
  • Linux C 网络基础编程
  • Redis高可用架构演进面试笔记
  • 13-C语言:第13天笔记
  • mysql索引底层B+树
  • HTTP/1.0、HTTP/1.1 和 HTTP/2.0 主要区别
  • OpenLayers 综合案例-基础图层控制
  • 主要分布在背侧海马体(dHPC)CA1区域(dCA1)的位置细胞对NLP中的深层语义分析的积极影响和启示
  • 《Java语言程序设计》第2章复习题(3)
  • 高亮标题里的某个关键字正则表达式
  • JMeter 性能测试实战笔记
  • 云端哨兵的智慧觉醒:Deepoc具身智能如何重塑工业无人机的“火眼金睛”
  • 无人机正摄影像自动识别与矢量提取系统
  • 无人机保养指南
  • 无人机速度模块技术要点分析
  • 04.建造者模式的终极手册:从快餐定制到航天飞船的组装哲学
  • (LeetCode 面试经典 150 题) 56. 合并区间 (排序)
  • Flutter 主流 UI 框架总结归纳
  • 让UV管理一切!!!