2017-05-20 168 views
0

對於一些原因,我必須手動生成,通過自定義命令靜態庫。CMake的add_custom_command與target_link_libraries

但是,似乎只有當目標明確請求其輸出文件時才執行自定義命令。

如果我嘗試生成的靜態庫target_link_libraries鏈接,CMake的抱怨說,它無法找到一個規則來生成它。

# Building library on the fly 
add_custom_command(OUTPUT mylib.a 
    COMMAND ... 
) 
add_executable(myexe main.cpp)                                      
target_link_libraries(myexe mylib.a) # Fails miserably 

我想我一定要插入一個目標或依賴某種方式add_custom_command調用和target_link_libraries一個之間,但我不知道如何正確地這樣做。

回答

0

對於保存可執行文件和庫文件之間的依賴關係,你需要使用庫文件完整路徑當它鏈接:

target_link_libraries(my_exe ${CMAKE_CURRENT_BINARY_DIR}/mylib.a) 

當使用相對路徑,CMake的期望庫被發現鏈接器(根據它的規則),所以CMake無法在這種情況下調整與庫文件的依賴關係。

+0

我指定的路徑就像你說的,但它仍然無法正常工作.. – Svalorzen

+2

嗯,所以CMake的跟蹤只有在庫文件改變而不結合'add_custom_command'。看起來你需要求助於進口圖書館的目標,如描述在這個問題(http://stackoverflow.com/questions/31274577/custom-target-as-a-target-library-in-cmake)。順便說一句,這個問題看起來像你的重複。 – Tsyvarev

+0

是的,它看起來是同樣的問題,以前找不到它。 – Svalorzen

0

我必須這樣做才能調用MATLAB的RTW爲我構建DLL。我使用的功能是add_custom_target

add_custom_target(Name [ALL] [command1 [args1...]] 
        [COMMAND command2 [args2...] ...] 
        [DEPENDS depend depend depend ... ] 
        [BYPRODUCTS [files...]] 
        [WORKING_DIRECTORY dir] 
        [COMMENT comment] 
        [VERBATIM] [USES_TERMINAL] 
        [COMMAND_EXPAND_LISTS] 
        [SOURCES src1 [src2...]]) 

對你來說可能是這樣的:

add_custom_target(MyLib ALL 
        <Put your command here> 
        COMMENT "Building MyLib" 
       ) 
add_executable(MyExe main.cpp) 
target_link_libraries(MyExe MyLib) 

如果我聽說,您可以使用add_library()創建一個虛擬庫,不工作。然後,使用set_target_properties()爲它創建一個INTERFACE屬性。

Refences:

add_custom_target

相關問題