当前位置: 首页 > 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
  • 适用场景:处理环境变量、用户输入或跨平台构建时的参数分割。

相关文章:

  • 全国信息素养大赛 图形化挑战赛~复赛练习-在正方形内吗?
  • 软件第三方测试:关键部分、意义、流程及方法全解析?
  • 数字智慧方案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/游标分页/异步大文件上传)
  • “名额5分钟抢完”,一场花费上万元:越野赛凭什么这么火?
  • 人民日报今日谈:为何重视这个“一体化”
  • 五一假期前两日,多地党政主官暗访景点、商圈安全工作
  • 426.8万人次!长三角铁路创单日客发量历史新高
  • 王毅谈金砖国家反恐和网络安全合作
  • 国台办:台商台企有信心与国家一起打赢这场关税战