2016-12-16 11 views
8

Ich habe ein externes Projekt und eine importierte gemeinsame Bibliothek. Die Include-Verzeichnisse und IMPLIB alle Arbeiten korrekt, sondern versuchen, die gemeinsame Bibliothek (DLL) zu installieren, schlägt mit dem folgenden Fehler:Kann ich eine gemeinsam genutzte importierte Bibliothek installieren?

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

Hier Code zu reproduzieren:

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

Irgendwelche Ideen?


EDIT: Für jetzt habe ich, dann FILES und den Wert dieser Eigenschaft geben mit INSTALL unter Verwendung GET_PROPERTY ziehen Sie die IMPORTED_LOCATION, um dieses Problem bekommen. Es scheint zu funktionieren, aber gibt es eine bessere, idiomatische-cmake-Lösung?

Antwort

6

CMake erlaubt keine Installation IMPORTIERTE Bibliotheken als ZIELE. Verwenden Sie stattdessen install(FILES).

Es mindestens zwei Gründe für dieses Verhalten sind:

  1. Сitation eines CMake Entwickler von 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. Wenn normale Bibliothek installieren, ist CMake der Lage, es zu ändern, zum Anpassen einiger Eigenschaften wie RPATH. Eine solche Änderung ist möglich, weil CMake weiß, wie die Bibliothek aufgebaut wurde. Dies ist ein Hauptvorteil der Installation der Bibliothek als TARGET.

    Aber für IMPORTIERT Bibliothek CMake hat keine Informationen über den Kompilierungsprozess der Bibliothek und kann keine sinnvolle Änderung daran vornehmen. Also, CMake kann nur Bibliotheksdatei wie folgt installieren: kein Vorteil gegenüber einfach install(FILES).

+0

'rpath' ist tatsächlich eine der wenigen Eigenschaften, die ganz leicht in elf Binärdateien verändert werden können https://nixos.org/patchelf.html – curlybracket

+0

installieren (TARGET) hat eine nützliche Eigenschaft hier nicht behandelt. Es erstellt auch die Links von .so zu .so. und .so. . auf Unix-ähnlichen Systemen. –

Verwandte Themen