当前位置: 首页 > 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.dtcms.com/a/296987.html

相关文章:

  • Python桌面版数独(五版)-优化选择模式触发新棋盘生成
  • OSPF 实验
  • RuoYi-Vue 项目 Docker 全流程部署实战教程
  • 中国、美国、欧盟、日本、英国临床试验API数据接口
  • Ⅹ—6.计算机二级综合题7---10套
  • Mac系统机能连接操控别的平台设备吗?能被远程操作吗?
  • Nginx快速入门及案例
  • 【安卓笔记】解决livedata粘性事件
  • 《Java语言程序设计》第2章复习题(2)
  • RePlugin 坑位使用原理与指南
  • 多源信息融合智能投资【“图神经网络+强化学习“的融合架构】【低配显卡正常运行】
  • 模拟退火算法 (Simulated Annealing, SA)简介
  • JavaWeb学习打卡14(JSP内置对象及作用域)
  • ARM汇编常见伪指令及其用法示例
  • IntelliJ IDEA中管理多版本Git子模块的完整指南
  • 智慧工厂网络升级:新型 SD-WAN 技术架构与应用解析
  • 商场导航软件:3D+AI 基于Deepseek 模型的意图识别技术解析
  • BacNet 是什么?跟 LoRaWAN 的关系是什么?
  • 将JS字节流转化为对象
  • 西安交通大学XJTU 通信/信息工程大三和部分大四 实验和课程答案
  • C++哪些运算符不能被重载?
  • kubernetes集群中部署CoreDNS服务
  • day46day47 通道注意力
  • 一种基于单片机控制的太阳能电池板系统设计
  • 集训Demo6
  • 挖掘录屏宝藏:Screenity 深度解析与使用指南
  • 《计算机网络》实验报告八 加密、数字签名与证书
  • pytest测试框架
  • AUTOSAR进阶图解==>AUTOSAR_SWS_BSWGeneral
  • 【Vue学习笔记】状态管理:Pinia 与 Vuex 的使用方法与对比【附有完整案例】