2016-01-13 844 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