CMake与Ninja:自定义命令中美元符号引发的目标识别问题
解决Ninja构建时自定义目标无法识别的问题
问题核心在于Ninja生成器对PRE_BUILD阶段的处理逻辑与Makefile完全不同,同时命令中的美元符号转义方式需要适配Ninja的解析规则。以下是两种直接可行的修复方案:
方案1:替换PRE_BUILD为PRE_LINK或POST_BUILD
CMake官方文档明确说明,PRE_BUILD仅对Visual Studio和Makefile生成器有效,Ninja生成器不支持该阶段。将执行阶段替换为PRE_LINK或POST_BUILD,即可让Ninja正确识别自定义目标:
cmake_minimum_required(VERSION 3.14) project(TEST) add_custom_target(Testtarget) add_custom_command(TARGET Testtarget PRE_LINK COMMAND echo '$$ Hello')
方案2:用VERBATIM调整转义规则
如果必须在目标构建前执行命令,可通过VERBATIM选项让CMake自动处理特殊字符转义,同时简化美元符号的写法:
cmake_minimum_required(VERSION 3.14) project(TEST) add_custom_target(Testtarget) add_custom_command( TARGET Testtarget PRE_BUILD COMMAND echo "$ Hello" VERBATIM )
VERBATIM会自动处理引号和特殊字符的转义逻辑,此时单个$就能被正确传递给shell,同时Ninja能正确关联自定义目标与命令。
原代码在Makefile下正常的原因
Makefile生成器会直接解析PRE_BUILD阶段的命令,且$$会被转义为单个$;但Ninja生成器不支持PRE_BUILD,导致CMake生成的Ninja脚本中没有正确建立目标与命令的关联,最终抛出"unknown target"错误。
内容的提问来源于stack exchange,提问作者FSat
相关产品推荐
相关产品推荐

