CMake错误:invalid escape sequence \c,如何优雅修复符号链接问题?
修复CMake install命令中符号链接的转义错误
问题原因
当路径中包含类似\code的子目录时,CMake解析install(CODE)中的字符串会把\c识别为无效转义序列,导致报错"invalid escape sequence \c"。这是因为CMake默认会解析字符串中的反斜杠作为转义标记,未被正确处理的路径会触发转义错误。
优雅修复方案
方案1:拆分命令并使用双引号包裹路径
将del和mklink拆分为独立的COMMAND子句,用双引号包裹路径变量,让CMake正确识别完整路径,避免转义问题:
file(TO_NATIVE_PATH "${CMAKE_CURRENT_LIST_DIR}/alib.pyd" native_pyd) file(TO_NATIVE_PATH "${DESTINATION}/lib/alib.pyd" release_pyd) install(CODE "execute_process( COMMAND cmd /c del /f /s /q \"${native_pyd}\" COMMAND cmd /c mklink \"${native_pyd}\" \"${release_pyd}\" COMMAND_ECHO STDOUT RESULT_VARIABLE link_exec_result ) # 可选:添加错误检查 if(NOT link_exec_result EQUAL 0) message(FATAL_ERROR \"创建符号链接失败,错误码:${link_exec_result}\") endif()")
方案2:使用$<SHELL_PATH>生成器表达式
利用CMake的生成器表达式自动处理路径转义,生成适配当前shell的路径格式:
file(TO_NATIVE_PATH "${CMAKE_CURRENT_LIST_DIR}/alib.pyd" native_pyd) file(TO_NATIVE_PATH "${DESTINATION}/lib/alib.pyd" release_pyd) install(CODE "execute_process( COMMAND cmd /c del /f /s /q $<SHELL_PATH:${native_pyd}> & mklink $<SHELL_PATH:${native_pyd}> $<SHELL_PATH:${release_pyd}> COMMAND_ECHO STDOUT )")
方案3:手动转义路径中的反斜杠
通过string(REPLACE)将路径中的单个反斜杠替换为双反斜杠,避免CMake解析时误判转义序列:
file(TO_NATIVE_PATH "${CMAKE_CURRENT_LIST_DIR}/alib.pyd" native_pyd) file(TO_NATIVE_PATH "${DESTINATION}/lib/alib.pyd" release_pyd) # 转义路径中的反斜杠 string(REPLACE "\\" "\\\\" escaped_native_pyd "${native_pyd}") string(REPLACE "\\" "\\\\" escaped_release_pyd "${release_pyd}") install(CODE "execute_process( COMMAND cmd /c del /f /s /q ${escaped_native_pyd} & mklink ${escaped_native_pyd} \"${escaped_release_pyd}\" COMMAND_ECHO STDOUT )")
方案对比
- 方案1最直观,拆分命令后逻辑清晰,还能添加错误检查,适合需要调试的场景。
- 方案2最简洁,利用CMake原生特性自动处理转义,无需手动操作。
- 方案3是兜底方案,适合必须保持原有命令拼接形式的场景。
内容的提问来源于stack exchange,提问作者naichuans
相关产品推荐
相关产品推荐

