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
相关产品推荐
相关产品推荐

