CMake und Reihenfolge abhängige Verknüpfung von gemeinsamen Bibliotheken
Habe ich ein paar kleine Komponenten, die ich Baue, wie shared libraries, die für meine Haupt-Anwendung. Können ein Beispiel der liba
und libb
. Jeder wird gebaut, in Ihr eigenes Unterverzeichnis wie folgt:
add_library(liba SHARED a.cpp)
Dann in den root Ordner Projekt, ich brauche, um zu verbinden, meine wichtigste Anwendung für beide.
include_directories(a)
include_directories(b)
add_executable(dummy dummy.cpp)
target_link_libraries(dummy a b)
CMake läuft mit diesem feinen, und meine Anwendung kompiliert, kann Sie aber nicht verknüpfen. Das problem ist, dass die b-Referenzen ein. Wenn ich liefern die Reihenfolge der Bibliotheken beim verknüpfen als
target_link_libraries(dummy b a)
Das Programm kompiliert und verlinkt einfach gut
Wenn diese Art von system beginnt mit komplexer inter Abhängigkeit der Bibliotheken, beginnt es unmöglich zu sein, auch wenn die Abhängigkeiten sind azyklisch. Wie verwalte ich die Verknüpfung Schritt hier? Gibt es da einen trick der Bestellung von Bibliotheken für die Verknüpfung in CMake?
InformationsquelleAutor der Frage dusktreader | 2012-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die Beziehung zwischen
a
undb
durch hinzufügenAus der docs:
So, wenn Sie angeben
a
als eine Abhängigkeit vonb
auf diese Weise brauchen Sie nicht einmal explizit Listea
in jedem Ziel, das hängt vonb
, d.h. deine anderen Befehl kann nur:obwohl es würde nicht Schaden, um die Liste
a
als gut.InformationsquelleAutor der Antwort Fraser
Eine einfache Lösung (vor allem für zirkuläre Abhängigkeiten) werden kann, setzen Sie einfach alle Ihre Bibliotheken in einer Liste variable, dann fügen Sie die Liste zweimal (oder mehr, wenn nötig), wie:
(oder geben Sie einfach aus der Liste zweimal nach einander in der
target_link_libraries
Funktion)Dieser arbeitete für mich durchaus ein paar mal, aber ich gebe zu, dass es möglicherweise einige mögliche Nachteile, die ich bewusst bin (anders als es schien, wie ein bisschen wie ein hack).
InformationsquelleAutor der Antwort sonicwave