编译SeqAn框架出现Ninja bad $-escape转义错误如何解决?
问题根源
错误来自build.ninja第152行的$(ConfigurationName)字段:
- Ninja语法要求字面$符号必须转义为
$$,否则会被识别为Ninja自身的变量,直接写$(会触发转义错误 $(ConfigurationName)是Visual Studio MSBuild生成器的专属宏,使用Ninja生成器时该宏没有对应值,也不会被自动解析
修复方案
方案1:更换生成器(最稳妥,无需修改项目代码)
将当前的Ninja生成器替换为Visual Studio 2019生成器,即可天然支持$(ConfigurationName)宏。修改CMakeSettings_schema.json配置如下:
{ "configurations": [ { "name": "x64-Clang-Debug", "generator": "Visual Studio 16 2019", "configurationType": "Debug", "buildRoot": "${projectDir}\\out\\build\\${name}", "installRoot": "${projectDir}\\out\\install\\${name}", "cmakeCommandArgs": "-A x64 -T ClangCL", "buildCommandArgs": "", "ctestCommandArgs": "", "inheritEnvironments": [ "clang_cl_x64_x64" ], "variables": [] } ] }
修改完成后删除原有build缓存目录,重新执行CMake生成步骤即可。
方案2:保留Ninja生成器,修改项目CMake配置
若必须使用Ninja生成器,找到SeqAn项目中定义alf.exe运行命令的CMakeLists.txt文件,将命令中的$(ConfigurationName)替换为CMake内置变量${CMAKE_BUILD_TYPE}。Ninja为单配置生成器,你已明确设置CMAKE_BUILD_TYPE=Debug,替换后CMake生成阶段会直接将路径写死为对应配置名,不会再出现未转义的$符号。
方案3:临时手动转义(仅临时测试使用)
若仅做临时验证,可直接手动修改生成的build.ninja第152行,将$(ConfigurationName)改为$$(ConfigurationName),Ninja会将$$识别为字面$,传递给cmd后再解析宏。该方案仅为临时处理,每次重新生成CMake都会覆盖修改内容,不建议长期使用。
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

