2013-01-15 5 views
9

Also baue ich eine gemeinsame Bibliothek, aus zwei statischen Bibliotheken.Wie setze ich Compiler-Befehlszeilenargs an bestimmten Stellen mit cmake

This answer sagt der Weg, es zu tun ist, -Wl,--whole-archive vor meinen statischen Bibliotheken einzufügen, die -Wl,--no-whole-archive nach ihnen.

Also, was ich habe in Cmake im Moment für die gemeinsam genutzte Bibliothek ist:

add_library(wittyPlus SHARED empty.cpp) 
target_link_libraries(wittyPlus 
    ${wtdbosqlite} 
    ${WT_LIBRARIES} 
    ${DB_LIBRARIES} 
    ${Boost_LIBRARIES} 
    app models 
) 

Also, was ich brauche, ist für sie die -Wl,--whole-archive vor app und models hinzufügen möchten, dann -Wl,--no-whole-archive nach ihnen (so dass die Import von Standardbibliotheken wird nicht von der freigegebenen Lib exportiert).

Was ist der einfachste Weg, dies in CMake zu tun?


Zusatz: Also würde ich so viel wie möglich den Standard Cmake Sachen verwenden möchten, auf diese Weise muss ich die Compiler-Definitionen nicht tun, um jede zusätzliche Arbeit für Fenster baut, wie CMake freundlich entfernt die auf der zu erstellenden Plattform nicht unterstützt werden.

Antwort

14

OK, es war viel einfacher als ich dachte.

So nach dem cmake docs:

Artikelnamen beginnend mit '-', aber nicht '-l' oder '-Framework' sind als Linker-Flags behandelt.

So war das Update nur auf:

add_library(wittyPlus SHARED empty.cpp) 
target_link_libraries(wittyPlus 
    ${wtdbosqlite} 
    ${WT_LIBRARIES} 
    ${DB_LIBRARIES} 
    ${Boost_LIBRARIES} 
    "-Wl,--whole-archive" 
    app models 
    "-Wl,--no-whole-archive" 
) 

Ich weiß nicht, ob es an den Fenstern arbeiten werde oder nicht, ich erwarte, dass es wird wie cmake Super klug ist.

Wenn man sich das Ergebnis mit objdump anschaut, scheint es im Export viel Auftrieb zu geben, also könnte ich etwas falsch machen.

objdump -C -t wittyPlus/libwittyPlus.so | grep -i boost 

Aber es hat die Sachen, die ich brauche, um es so zu verbinden, das ist ein Schritt vorwärts.

Alle anderen Antworten noch geschätzt. Im Grunde, was ich versuche, ist das gleiche wie diese Frage zu tun:

CMake: how create a single shared library from all static libraries of subprojects?

+0

Haben Sie eine Arbeit gefunden, die keine leere Datei 'empty.cpp' erfordert? –

+0

Nein, ich benutze die empty.cpp die ganze Zeit. – matiu

+3

Ich sehe aus, als könntest du 'file (WRITE empty.cpp" ")" tun, wenn du deinen echten Quellbaum nicht mit Junk-Dateien verschmutzen willst. –

0

Wenn Sie die statischen Bibliotheken selbst bauen, können Sie diesen Ansatz verwenden können: https://stackoverflow.com/a/29824424/4069571 nämlich bauen sie als Objektbibliotheken zuerst, dann die Verknüpfung sie in die jeweiligen gemeinsamen und statischen Bibliotheken.