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

CMake separate_arguments用法详解

separate_arguments 是 CMake 中用于将字符串分割成参数列表的命令,适用于处理包含空格的参数或复杂命令行参数。以下是其用法详解:

基本语法

separate_arguments(<variable> [UNIX|WINDOWS_COMMAND] [PROGRAM <program>] [ARGS <args>])
  • <variable>: 存储分割后结果的变量名。
  • 模式选择:
    • UNIX_COMMAND: 按 UNIX Shell 规则分割参数(默认模式),处理空格、引号和转义符。
    • WINDOWS_COMMAND: 按 Windows 命令行规则分割参数。
  • PROGRAMARGS: 指定程序及其参数,自动选择对应平台的分割方式。

使用场景

  1. 处理带空格的路径或参数

    set(ARGS_STRING "src/main.cpp -Iinclude -O2 \"Hello World.cpp\"")
    separate_arguments(SPLIT_ARGS UNIX_COMMAND ${ARGS_STRING})
    message("分割结果: ${SPLIT_ARGS}")
    

    输出:

    分割结果: src/main.cpp;-Iinclude;-O2;Hello World.cpp
    
  2. 从环境变量读取参数

    set(ENV{CFLAGS} "-O2 -Wall -DNAME=\"My Project\"")
    separate_arguments(MY_CFLAGS UNIX_COMMAND $ENV{CFLAGS})
    target_compile_options(myapp PRIVATE ${MY_CFLAGS})
    
  3. 跨平台参数处理

    if(WIN32)separate_arguments(ARGS WINDOWS_COMMAND "C:/Program Files/app.exe --flag")
    else()separate_arguments(ARGS UNIX_COMMAND "/usr/local/bin/app --flag")
    endif()
    

关键注意事项

  • 引号与转义:
    • UNIX 模式识别双引号 " 和反斜杠转义的空格(如\ )。
    • Windows 模式遵循其命令行解析规则。
  • 分号处理:
    • CMake 列表以分号分隔,分割后的变量可直接用于需要列表的地方(如 target_compile_options)。
  • 默认模式:
    • 若不指定模式,默认使用 UNIX_COMMAND

示例:传递复杂参数

# 定义包含空格的参数
set(ARGS "--input=input.txt" "--output=output file.txt" "-DOPTION=\"A String\"")
separate_arguments(ARGS_LIST UNIX_COMMAND ${ARGS})# 在自定义命令中使用
add_custom_command(OUTPUT result.txtCOMMAND some_tool ${ARGS_LIST}DEPENDS input.txt
)

此例确保 some_tool 正确接收 --input=input.txt--output=output file.txt-DOPTION="A String" 三个参数。


总结

  • 用途:将字符串转换为 CMake 列表,便于处理复杂参数。
  • 模式选择:根据目标平台选择 UNIX_COMMANDWINDOWS_COMMAND
  • 适用场景:处理环境变量、用户输入或跨平台构建时的参数分割。
http://www.xdnf.cn/news/252829.html

相关文章:

  • Trae 安装第三方插件支持本地部署的大语言模型
  • Matlab自学笔记
  • 姜老师MBTI人格分析课程2:ENFP
  • 标准解读:《制造业质量管理数字化实施指南(试行)》【附全文阅读】
  • 个人健康中枢的多元化AI软件革新与精准健康路径探析
  • #以梦为楫,共航中医传承新程
  • CPU:AMD的线程撕裂者(Threadripper)和霄龙(EPYC)的区别
  • C++八股--three day --设计模式之单例和工厂
  • UE运行游戏时自动播放关卡序列
  • 深度学习笔记40_中文文本分类-Pytorch实现
  • 大数据面试问答-数据湖
  • 阿里云服务器 篇五(加更):短链服务网站:添加反垃圾邮件功能
  • 多模态大语言模型arxiv论文略读(五十五)
  • Python爬虫实战:获取好大夫在线各专业全国医院排行榜数据并分析,为患者就医做参考
  • sys目录介绍
  • C++11新特性_标准库_正则表达式库
  • 数据分析_问题/优化
  • Mysql数据库之基础管理
  • 基于SpringBoot的药房药品销售管理系统
  • 深入解析C++11委托构造函数:消除冗余初始化的利器
  • Webug4.0靶场通关笔记13- 第22关越权修改密码
  • 从此,K8S入门0门槛!
  • Qt QGraphicsScene 的用法
  • openEuler 22.03 安装 Mysql 5.7,RPM 在线安装
  • C++ - 数据容器之 list(创建与初始化、元素访问、容量判断、元素遍历、添加元素、删除元素)
  • 父子组件双向绑定
  • ElasticSearch深入解析(八):索引设置、索引别名、索引模板
  • Windows配置grpc
  • 红米Note9 4G版拆开后盖操作细节
  • 51c嵌入式~电路~合集4