2016-12-16 42 views
8

我有一個外部項目和一個導入的共享庫。在包括目錄和正確IMPLIB所有的工作,但要安裝的共享庫(DLL)失敗,出現以下錯誤:我可以安裝共享導入的庫嗎?

install TARGETS given target "my_shared_lib" which does not exist in this directory. 

這裏的代碼來重現:

add_library(my_shared_lib SHARED IMPORTED GLOBAL) 
set_property(TARGET my_shared_lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib") 
set_property(TARGET my_shared_lib PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.dll") 
set_property(TARGET my_shared_lib PROPERTY IMPORTED_IMPLIB "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.lib") 

add_executable(main main.cpp) 
add_dependencies(main my_shared_lib) 
target_link_libraries(main PUBLIC my_shared_lib) 

install(TARGETS main DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST") 
install(TARGETS my_shared_lib DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST") 

任何想法?


編輯:現在我已經解決此問題,通過使用get_property拔出IMPORTED_LOCATION,然後使用安裝文件,並給予該財產的價值得到。它似乎工作,但有沒有更好的,更習慣cmake解決方案?

回答

6

CMake不允許安裝IMPORTED庫作爲目標。改爲使用install(FILES)

至少有2個原因對這種行爲:

  1. CMake的開發者之一,從bug report

    Imported targets were originally designed for importing from an existing installation of some external package so installing did not make sense at the time.

  2. 當安裝正常庫Сitation,CMake的是能夠修改用於調整像RPATH這樣的屬性。這種修改是可能的,因爲CMake 知道庫的構建方式是。這是將庫安裝爲TARGET的主要優勢。

    但是對於IMPORTED庫CMake沒有關於圖書館編譯過程的信息,也無法對其進行任何合理的修改。因此,CMake可能只會按原樣安裝庫文件:對簡單的install(FILES)沒有任何優勢。

+0

'rpath'實際上是可以在ELF可執行文件,很容易被修改的幾個屬性之一 https://nixos.org/patchelf.html – curlybracket

+0

安裝在(目標)這裏沒有涉及到一個有用的屬性。它還創建從 .so到 .so的鏈接。 .so。 。在類Unix系統上的。 –

相關問題