2016-12-16 8 views
8

Mam projekt zewnętrzny i zaimportowaną bibliotekę współdzieloną. Include katalogów i implib wszystko działa prawidłowo, ale próbuje zainstalować dzielone biblioteki (DLL) nie powiedzie się z powodu następującego błędu:Czy mogę zainstalować udostępnioną bibliotekę importowaną?

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

Oto kod do reprodukcji:

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

jakieś pomysły?


EDIT: Teraz stałam się wokół tego problemu za pomocą get_property wyciągnąć IMPORTED_LOCATION, a następnie za pomocą instalacji plików i podając wartość tej nieruchomości. Wydaje się działać, ale czy istnieje lepsze, bardziej idiomatyczne rozwiązanie cmake?

Odpowiedz

6

CMake nie zezwala na instalację bibliotek IMPORTOWANYCH jako CELÓW. Zamiast tego użyj install(FILES).

Istnieją co najmniej 2 Przyczyny takiego zachowania:

  1. Сitation jednego CMake wywoływacza z 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. Po zainstalowaniu normalnego biblioteki CUpewnij może go modyfikować aby dostosować niektóre właściwości, takie jak RPATH. Modyfikacja taka jest możliwa, ponieważ CMake wie, jak została zbudowana biblioteka. Jest to główna zaleta instalowania biblioteki jako TARGET TARGET.

    Ale dla IMPORTOWANA biblioteka CMake nie ma informacji o procesie kompilacji biblioteki i nie może wykonać żadnej rozsądnej modyfikacji. Tak więc CMake może instalować plik biblioteki tylko tak: nie ma żadnej przewagi nad prostym install(FILES).

+0

'rpath' jest rzeczywiście jednym z niewielu cech, które mogą być modyfikowane w elf binariów dość łatwo https://nixos.org/patchelf.html – curlybracket

+0

zainstalować (TARGET) ma jedną użyteczną właściwość nieobjętych tutaj. Tworzy także łącza z .to do .so. i .so. . na systemach typu Unix. –

Powiązane problemy