2016-03-23 4 views
1

zu Export habe ich ein Projekt mit dieser Struktur:Cmake: Anbindung an statischer interne Bibliothek ohne es

/path/to/my/project 
├── CMakeLists.txt 
├── internal-libs 
│ ├── internal-lib1 
├── libs 
│ ├── lib1 
│ ├── lib2 

lib1 ist eine statische Bibliothek.

lib2 ist eine statische Bibliothek.

internal-lib1 ist eine statische Bibliothek.

lib2 verbindet statisch mit lib2 und internal-lib1. lib1 und lib2 werden exportiert, aber internal-lib1 wird zurückgelassen werden. Für die Verknüpfung, die ich habe:

target_link_libraries(lib2 PRIVATE internal-lib1) 
target_link_libraries(lib2 PRIVATE lib1) 

Mein Verständnis ist, dass, weil ich die Verknüpfung statisch und privat, Alle Informationen über interne-lib1 würde in lib2 enthalten sein und dass ich nicht intern-lib1 zu exportieren haben zur Außenwelt.

Allerdings, wenn ich versuche, es in einem Client-Programm zu verwenden, ich den Fehler:

/usr/bin/ld cannot find -llib-internal1 
collect2: error: ld returned 1 exit status 

in meinem erzeugt Export Config-Datei, die ich habe:

# Create imported target lib2 
add_library(lib2 STATIC IMPORTED) 
set_target_properties(lib2 PROPERTIES 
INTERFACE_LINK_LIBRARIES "$<LINK_ONLY:lib1>;**$<LINK_ONLY:internal-lib1>**" 
) 
# Create imported target lib1 
add_library(lib1 STATIC IMPORTED) 

bin ich Missverständnis der statische Verknüpfung oder stimmt etwas nicht mit meinem Setup? Ich benutze cmake 3.2.2. Alle meine Zielvorgaben sind PRIVAT. Ich verstehe nicht, warum INTERFACE_LINK_LIBRARIES mit Einträgen gefüllt ist und was LINK_ONLY bedeutet.

p.s. Eigentlich sollten lib1 und lib2 gemeinsam genutzte Bibliotheken sein, aber ich kann nicht einmal die statische Version zur Vereinfachung verwenden. Hier beschreibe ich den statischen Fall für die exportierbaren Bibliotheken.

Antwort

3

Der CMake Befehl

target_link_libraries(lib2 PRIVATE lib1) 

bedeutet nicht, dass die Bibliothek lib1 in die Bibliothek kopiert lib2 auf die Verknüpfung. Das Schlüsselwort PRIVATE wirkt sich nur auf transitive usage requirements der Bibliothek lib1 aus, wenn eine andere Bibliothek auf lib2 verweist.

CMake lib1 in lib2 haben fusionieren, verwenden libtool auf die Verknüpfung und eine POST_BUILD Aktion:

add_custom_command(TARGET lib2 POST_BUILD 
    COMMAND /usr/bin/libtool -static -o $<TARGET_FILE:lib2> 
    $<TARGET_FILE:lib2> $<TARGET_FILE:lib1> 

In diesem Fall besteht keine Notwendigkeit, lib1 zu lib2 mit target_link_libraries zu verknüpfen.

+0

Ich sehe danke. Ich habe im Grunde versucht zu tun, was versucht wird (http://stackoverflow.com/a/11448878/4376555) für den einfachen Fall von statischen Bibliotheken, da ich dachte, dass seine Methoden aber unnötig kompliziert sind. Aber ich denke, Ihre Lösung ist noch hacky. – ShS