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?
'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
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. –