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

相关文章:

  • 全国信息素养大赛 图形化挑战赛~复赛练习-在正方形内吗?
  • 软件第三方测试:关键部分、意义、流程及方法全解析?
  • 数字智慧方案5876丨智慧交通枢纽智能化系统建设方案(56页PPT)(文末有下载方式)
  • 对解微分方程分离变量法本质的思考
  • 进程与线程:05 内核级线程实现
  • 综合案例:使用vuex对购物车的商品数量和价格等公共数据进行状态管理
  • GNOME扩展:ArcMenu的Brisk布局左右调换
  • C语言与指针3——基本数据类型
  • 大语言模型能力评定探讨
  • AI实现制作logo的网站添加可选颜色模板
  • 【OFDM过程中正交子载波特性的应用及全面解析】
  • FPGA:介绍几款高速ADC及其接口形式
  • 抽奖算法场景
  • Linux C++ JNI封装、打包成jar包供Java调用详细介绍
  • 第十六届蓝桥杯单片机组省赛(第一套)
  • 【HarmonyOS Next】地图使用详解(三)标点定位问题
  • 输入输出(python)
  • 【JavaScript-Day 1】从零开始:全面了解 JavaScript 是什么、为什么学以及它与 Java 的区别
  • 6.9.单源最短路径问题-BFS算法
  • (六——下)RestAPI 毛子(Http resilience/Refit/游标分页/异步大文件上传)
  • [英语单词] from under
  • 6.10.单源最短路径问题-Dijkstra算法
  • Linux系统常用命令、标准C库函数和系统调用
  • 27.电源和地的单点串并联接线隐患及对EMC的影响分析
  • 模型上下文协议(MCP)
  • HDLBIT-程序(Procedures)
  • Python爬虫实战:获取易车网最新特定车型销量数据并分析,为消费者购车做参考
  • Java零基础入门Day4:数组与二维数组详解
  • 主机Windows和虚拟机ubuntu和开发板三者互ping学习记录
  • Python高级爬虫之JS逆向+安卓逆向1.7节: 面向对象