2016-01-13 843 views
3

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

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 \调试\

但是这给了我一个错误。使用代码4.

退出。如果我进入项目属性,黑客命令行并改变它来添加“”

XCOPY/d/Y“LocalBin \ example.tlb”“ProgramBin \调试\”

它的工作原理。

有没有办法改变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 \\ $ \\“),它的工作原理,谢谢!!!一直在我的头上敲这个 – PowPowPowell

回答

3

你必须escape字符串内的引号。在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" 
0

不幸的是,这只适用于命令参数,但不适用于命令本身。当你必须调用程序文件中的着色器编译器(其中包含空格的路径)并且预构建规则失败时,这真的没什么好玩的。要解决此问题,我使用cmake文件(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") 
+0

为什么不逃脱你的案件工作? – usr1234567

0

与此挣扎了一段时间后,我发现使用generator expressions一个可行的解决方案:

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>\\">) 

这是一个开放的bug in CMake

+0

与'\”'转义有什么优势? – usr1234567

+0

用\“转义不起作用的命令名本身。CMake字面输出\” –

+0

它有助于将命令存储在变量中,其中\“工作,并将其作为命令传递? – usr1234567