You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake生成VS2017方案时add_custom_command引号致脚本失败的解决咨询

解决CMake add_custom_command 自动添加引号导致LIB.EXE执行失败的问题

这个问题的核心是你使用了VERBATIM选项,并且把LIB.EXE的所有参数打包成了一个字符串——CMake的VERBATIM会为了跨平台兼容性,将整个参数字符串包裹在引号中,导致LIB.EXE无法正确解析这些参数(它会把引号里的内容当成单个参数,而不是多个独立的选项和文件路径)。

解决这个问题的最佳方式是拆分命令参数,把每个选项和文件路径作为单独的参数项传递给COMMAND,而不是整合成一个字符串。同时推荐使用CMake原生的生成器表达式替代VS的$(OutDir),这样写法更通用,也能避免路径解析的问题。

修改后的CMake代码如下:

add_custom_command(
    TARGET "MyProject"
    POST_BUILD
    COMMAND LIB.EXE 
        -OUT:$<TARGET_FILE_DIR:MyProject>/MyProject_static.lib
        c:/libs/liba.lib
        c:/libs/libb.lib
    COMMENT "Merging into a static library"
    VERBATIM
)

为什么这样能解决问题?

  • 拆分参数后,VERBATIM会针对每个独立的参数进行转义处理(如果需要的话),而不是把所有参数打包成一个带引号的整体。
  • 使用$<TARGET_FILE_DIR:MyProject>生成器表达式,可以自动获取目标输出目录的绝对路径,比VS的$(OutDir)更符合CMake的跨平台设计,也能避免路径变量解析的潜在问题。

如果你坚持使用$(OutDir)(比如项目有特定需求),也可以保持这个变量,但同样需要拆分参数:

add_custom_command(
    TARGET "MyProject"
    POST_BUILD
    COMMAND LIB.EXE 
        -OUT:$(OutDir)MyProject_static.lib
        c:/libs/liba.lib
        c:/libs/libb.lib
    COMMENT "Merging into a static library"
    VERBATIM
)

这样修改后,VS生成的构建后事件命令会正确将每个参数独立传递给LIB.EXE,不会再出现多余的引号包裹。

内容的提问来源于stack exchange,提问作者CDZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:15:32