在CMake字符串中添加引号

11

我正在使用CMake创建和构建我的项目解决方案。我正在使用以下命令将一个后期构建事件添加到程序bin目录,从而将.tlb文件从本地的bin目录复制到程序bin目录。

ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD COMMAND xcopy /D /Y "${CMAKE_SOURCE_DIR}LocalBin\\example.tlb" "${CMAKE_SOURCE_DIR}ProgramBin\\$<CONFIGURATION>\\")
当这个命令添加到项目属性中时,它被添加为:xcopy /D /Y LocalBin\example.tlb ProgramBin\Debug\ 然而这会导致错误。退出码为4。 如果我进入项目属性并修改命令行以添加“”,如下所示: xcopy /D /Y "LocalBin\example.tlb " "ProgramBin\Debug\" 那么就可以工作了。 有没有办法修改 CMake 添加自定义命令以在实际命令行中包含“”,以使其正常工作,并且无需手动更改项目属性?

2
你必须对它们进行转义。添加 \" - usr1234567
1
太棒了!将命令更改为ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD COMMAND xcopy /D /Y "${CMAKE_SOURCE_DIR}LocalBin\example.tlb" "${CMAKE_SOURCE_DIR}ProgramBin\$<CONFIGURATION>\"),它可以工作了。谢谢!我一直在苦苦思索这个问题。 - PowPowPowell
3个回答

12

您需要转义字符串中的引号。在CMake中使用反斜杠进行转义。因此,向您的字符串中添加引号,需要添加\"

引用CMake文档 https://cmake.org/cmake/help/v3.4/manual/cmake-language.7.html#escape-sequences

\后跟一个非字母数字字符只是编码了它而不将其解释为语法

在您的情况下,最终会得到

"\"${CMAKE_SOURCE_DIR}LocalBin\\example.tlb\""

替代

"${CMAKE_SOURCE_DIR}LocalBin\\example.tlb"

我有点困惑,应该是 \""${CMAKE_SOURCE_DIR}LocalBin\\example.tlb"\" 还是 \"" - Felix F Xu

6

在苦苦挣扎一段时间后,我发现使用生成器表达式找到了一个可行的解决方案:

ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD COMMAND xcopy /D /Y $<1:"${CMAKE_SOURCE_DIR}LocalBin\\example.tlb"> $<1:"${CMAKE_SOURCE_DIR}ProgramBin\\$<CONFIGURATION>\\">)

这是CMake中的一个公开bug


\" 转义有什么优势? - usr1234567
在命令名称本身中使用 " 转义无效。CMake 会直接输出 "。 - Alex Goldberg
将命令存储在变量中,使用“\”进行转义,并将其作为命令传递,这样有帮助吗? - usr1234567
不行,那也不起作用。我建议你试一下。除了我上面提到的解决方案,我还找到了另外几个创造性的解决方案。不知道为什么有人没有留下评论就给踩了。 - Alex Goldberg
可能是因为你的回答没有包含你给我的附加信息。我编辑了CMake问题跟踪器的链接,这是一个已知的错误。 - usr1234567

0

遗憾的是,这仅适用于命令参数,而不适用于命令本身。当您必须调用位于Program Files(路径中带有空格)中的着色器编译器并且预构建规则失败时,这真的很无聊。为了解决这个问题,我使用cmake file(WRITE ...)命令动态创建批处理文件,然后使用正确转义的路径调用此批处理文件以执行实际的着色器编译器。在批处理文件中,我有一行包含%1

我的问题的解决方案

file(WRITE Shaders/compile_shaders.bat "\
%1 /ESolveVMF /Tcs_5_0 /DTGSize_=16 /Fh \"${CMAKE_CURRENT_LIST_DIR}/Shaders/GenerateRoughnessMaps.inc\" \"${CMAKE_CURRENT_LIST_DIR}/Shaders/GenerateRoughnessMaps.hlsl\"\n\
%1 /ESolveVMFReconstructNormal /Tcs_5_0 /DTGSize_=16 /Fh \"${CMAKE_CURRENT_LIST_DIR}/Shaders/GenerateReconstructNormalRoughnessMaps.inc\" \"${CMAKE_CURRENT_LIST_DIR}/Shaders/GenerateRoughnessMaps.hlsl\"")

add_custom_command(TARGET ${CURRENT_MODULE_NAME} PRE_BUILD
                  COMMAND "${CMAKE_CURRENT_LIST_DIR}\\Shaders\\compile_shaders.bat" "\"$(WindowsSdkDir)bin\\x86\\fxc.exe\""
                  COMMENT "Compiling shaders")

最好使用configure_file()从模板生成.bat文件。 - Rafael Kitover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接