2012-04-03 72 views
18

後生成步驟我有根據配置獲得一個不同名稱的動態庫,由CMake的腳本中指定的其他位置:複製目標文件,在CMake的

set_target_properties(${name} PROPERTIES OUTPUT_NAME ${outputName}64) 
set_target_properties(${name} PROPERTIES DEBUG_OUTPUT_NAME ${outputName}64_d) 

最終的結果是,我在發佈和調試版本上獲得不同的名稱。我想將生成的庫複製到不同的目錄中作爲後期製作步驟,但CMake-Fu的禮物(?)沒有真正對你的微笑。

我也試着這樣做:

GET_TARGET_PROPERTY(origfile mylibrary LOCATION) 
STRING(REGEX REPLACE "/" "\\\\" origfile ${origfile}) 

set(targetfile my_target_path\\${CMAKE_CFG_INTDIR}\\) 
STRING(REGEX REPLACE "/" "\\\\" targetfile ${targetfile}) 

add_custom_command(TARGET mylibrary POST_BUILD 
    COMMAND copy ${origfile} ${targetfile} 
) 

這工作正常發佈版本,但調試源不包括我本來期望的_D。 如何獲取目標的輸出路徑,以便我可以複製文件?

注:正如從上面的代碼中可以看出,這是目前適用於Windows/Visual Studio中,但我想這對OS X/Xcode的工作/作出爲好。

注:我需要將庫放置在一個額外的目錄中,作爲依賴於這個庫的其他幾個項目的輸出目錄,以便這些項目能夠在運行時加載庫。一個可以接受的替代解決方案是能夠創建一個自定義目標來完成複製,以便其他項目可以依賴於該項目,而該項目又取決於該庫。

回答

34

而不是使用過時的LOCATION財產,傾向於使用生成器表達式:

add_custom_command(TARGET mylibrary POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mylibrary> ${targetfile} 
) 

你也只需要直接通過設置目標屬性RUNTIME_OUTPUT_DIRECTORY,而不是將其複製生成目標目錄中的exe文件。這有每個配置選項(例如RUNTIME_OUTPUT_DIRECTORY_DEBUG)。

set_target_properties(mylibrary PROPERTIES 
         RUNTIME_OUTPUT_DIRECTORY_DEBUG <debug path> 
         RUNTIME_OUTPUT_DIRECTORY_RELEASE <release path> 
) 

欲知詳情運行:

cmake --help-property "RUNTIME_OUTPUT_DIRECTORY" 
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY_<CONFIG>" 

此外,你應該能夠使用正斜槓整個作爲路徑分隔符,即使是在Windows上。

+2

如果你的目標的Xcode或Visual Studio,你可能需要使用RUNTIME_OUTPUT_DIRECTORY代替,讓IDE採取附加配置正確的護理。 (正如你會發現,如果你運行幫助cmd @Fraser添加) – 2016-01-14 19:41:43

10

POST_BUILD命令中使用generator expressions而不是手動計算輸出路徑。這些都是配置感知。例如:

add_custom_command(TARGET mylibrary POST_BUILD 
    COMMAND "${CMAKE_COMMAND}" -E copy 
    "$<TARGET_FILE:mylibrary>" 
    "my_target_path/$<CONFIGURATION>/$<TARGET_FILE_NAME:mylibrary>" 
    COMMENT "Copying to output directory") 
相關問題