Gleiche Quelle, all das, nur eine statische und gemeinsame Version beide. Einfach zu erledigen?Ist es möglich, CMake zum Erstellen einer statischen und freigegebenen Version der gleichen Bibliothek zu bekommen?
Antwort
Ja, es ist mäßig einfach. Nur zwei „add_library“-Befehle verwenden:
add_library(MyLib SHARED source1.c source2.c)
add_library(MyLibStatic STATIC source1.c source2.c)
Auch wenn Sie viele Quelldateien haben, würden Sie die Liste der Quellen in einer Cmake Variablen halten, so ist es immer noch einfach zu tun.
Unter Windows sollten Sie wahrscheinlich jeder Bibliothek einen anderen Namen geben, da es eine ".lib" -Datei für freigegebene und statische Dateien gibt. Aber auf Linux und Mac können Sie sogar beide Bibliotheken geben den gleichen Namen (zB libMyLib.a und libMyLib.so):
set_target_properties(MyLibStatic PROPERTIES OUTPUT_NAME MyLib)
Aber ich nicht empfehlen, sowohl die statischen und dynamischen Versionen der Bibliothek gibt dem gleichen Name. Ich bevorzuge es, andere Namen zu verwenden, da dies die Auswahl von statischen und dynamischen Verknüpfungen in der Kompilierzeile für Werkzeuge vereinfacht, die mit der Bibliothek verknüpft sind. Normalerweise wähle ich Namen wie libMyLib.so (shared) und libMyLib_static.a (statisch). (Das wären die Namen unter Linux.)
Es ist im Allgemeinen nicht notwendig, ADD_LIBRARY-Aufrufe für Ihren Zweck zu duplizieren. So stellen Sie die Verwendung von
$> man cmake | grep -A6 '^ *BUILD_SHARED_LIBS$'
BUILD_SHARED_LIBS
Global flag to cause add_library to create shared libraries if on.
If present and true, this will cause all libraries to be built shared unless the library was
explicitly added as a static library. This variable is often added to projects as an OPTION
so that each user of a project can decide if they want to build the project using shared or
static libraries.
, während der ersten Gebäude (in einer Out-of-Source-Verzeichnis) mit -DBUILD_SHARED_LIBS: BOOL = ON und OFF mit in den anderen
Dies scheint nicht BEIDE statische und geteilte Versionen zu bauen, was ich denke, was diese Frage ist. –
Da CMake 2.8.8 Version, können Sie Verwenden Sie "Objektbibliotheken" , um die doppelte Kompilierung der Objektdateien zu vermeiden. Mit Christopher Bruns' Beispiel für eine Bibliothek mit zwei Quelldateien:
# list of source files
set(libsrc source1.c source2.c)
# this is the "object library" target: compiles the sources only once
add_library(objlib OBJECT ${libsrc})
# shared libraries need PIC
set_property(TARGET ${objlib} PROPERTY POSITION_INDEPENDENT_CODE 1)
# shared and static libraries built from the same object files
add_library(MyLib_shared SHARED $<TARGET_OBJECTS:objlib>)
add_library(MyLib_static STATIC $<TARGET_OBJECTS:objlib>)
Vom CMake docs:
Eine Objektbibliothek Quelldateien kompiliert, sondern archiviert werden nicht oder Link ihre Objektdateien in eine Bibliothek. Stattdessen können andere Ziele, die durch add_library() oder add_executable() erstellt wurden, auf die Objekte verweisen, indem ein Ausdruck der Form $ als Quelle verwendet wird, wobei objlib der Objektbibliotheksname ist.
Einfach gesagt, die add_library(objlib OBJECT ${libsrc})
Befehl weist CMake die Quelldateien *.o
Objektdateien zu kompilieren. Diese Sammlung von *.o
Dateien wird dann als $<TARGET_OBJECT:objlib>
in den beiden add_library(...)
-Befehlen bezeichnet, die die entsprechenden Bibliothekserstellungsbefehle aufrufen, die die freigegebenen und statischen Bibliotheken aus dem gleichen Satz der Objektdateien erstellen. Wenn Sie viele Quelldateien haben, kann das Kompilieren der *.o
Dateien ziemlich lange dauern; Mit Objektbibliotheken kompilieren Sie sie nur einmal.
Der Preis, den Sie zahlen, ist, dass die Objektdateien als positionsunabhängiger Code erstellt werden müssen, da gemeinsame Bibliotheken dies benötigen (statische Bibliotheken sind nicht wichtig). Beachten Sie, dass positionsunabhängiger Code möglicherweise weniger effizient ist. Wenn Sie also maximale Leistung anstreben, sollten Sie statische Bibliotheken verwenden. Außerdem ist es einfacher, statisch verknüpfte ausführbare Dateien zu verteilen.
Wahr, normalerweise füge ich _shared und _static Suffixe hinzu. Beantwortete Antwort oben, danke für das Aufzeigen. Ich stimme auch zu, dass es eine Frage der persönlichen Präferenz ist. Für meine Anwendungsfälle funktionierte obj libs ziemlich gut, YMMV. –
Das funktionierte wie ein Zauber für mich - der einzige Vorbehalt waren nachfolgende 'target_link_libraries()' Aufrufe, die von Ihrer Bibliothek abhängen, können nicht die "Objektbibliothek" verwenden, um dagegen zu verlinken; Diese müssen auf die neuen freigegebenen oder statischen Bibliotheken abzielen (und möglicherweise dupliziert werden). Aber im Gegensatz zu den Erfahrungen der ersten Kommentatoren war dies sehr nützlich und erlaubte mir, alle duplizierten Ziele zu entfernen und alle meine 'CMakeLists.txt' Dateien um fast die Hälfte zu schneiden. – fish2000
Müssen Sie das Obblib beim Festlegen der Zieleigenschaften "flüchten"? d. h. set_property (TARGET $ {objlib} PROPERTY ...) und set_property (TARGET objlib PROPERTY ...) – gnac
Es ist in der Tat möglich.Als @Christopher Bruns in seiner Antwort sagte, müssen Sie zwei Versionen der Bibliothek hinzuzufügen:
set(libsrc source1.c source2.c source3.c)
add_library(mylib-static STATIC ${libsrc})
add_library(mylib-shared SHARED ${libsrc})
Dann wird, wie here beschrieben, müssen Sie angeben, dass beide Ziele die gleichen Ausgabenamen verwenden sollten, und nicht gegenseitig überschreiben Dateien:
SET_TARGET_PROPERTIES(mylib-static PROPERTIES OUTPUT_NAME mylib CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(mylib-shared PROPERTIES OUTPUT_NAME mylib CLEAN_DIRECT_OUTPUT 1)
auf diese Weise werden Sie sowohl libmylib.a und libmylib.so (unter Linux) oder mylib.lib und MYLIB.DLL (unter Windows) erhalten.
Dies ist unnötig, wenn CMake-Versionen über 2.8. [0?] Verwendet werden, da die Eigenschaft 2009 entfernt wurde und das von ihr bereitgestellte Verhalten jetzt der Standardwert ist. Dies kann nützlich sein für Leute unter 2.8, aber wenn du CMake <2.7 verwendest, bitte ich dich um ein Upgrade. https://github.com/Kitware/CMake/commit/430cc2b4b7a817be2fbc445d6803163f1695a533 – KymikoLoco
- 1. Warum ignoriert CMake beim Erstellen einer statischen Bibliothek Assemblydateien?
- 2. Auswählen einer freigegebenen oder statischen Bibliothek mit Cargo
- 3. Erstellen einer statischen Bibliothek mit Cocoapods
- 4. CMake: Mehrere Executables in einem Projekt mit einer statischen Bibliothek erstellen
- 5. Erstellen einer statischen Bibliothek in C
- 6. Erstellen einer statischen Bibliothek aus iOS Anwendungsprojekt
- 7. Wie statische und gemeinsame Bibliothek zur gleichen Zeit durch cmake
- 8. Ist es möglich, eine verwaltete und eine nicht verwaltete Version derselben C++ - Assembly zu erstellen?
- 9. C: Erstellen einer statischen Bibliothek und Verknüpfen mit einem Makefile
- 10. Ist es möglich, eine ListViewGroup zu erstellen
- 11. Kompilieren einer statischen ausführbaren Datei mit CMake
- 12. Ist es möglich, eine optionale und nicht optionale Version eines schnellen Protokolls dynamisch zu erstellen?
- 13. Ist es möglich, eine defekte Deflate aus java.util.zip.Deflater zu bekommen?
- 14. Ist es möglich, GNU Grep als Bibliothek zu portieren?
- 15. Was ist der Unterschied zwischen einer statischen Bibliothek und einer dynamischen Bibliothek?
- 16. Inhalt einer statischen Bibliothek
- 17. Mit CMake statisch zu einer Bibliothek außerhalb des Projekts verknüpfen
- 18. Ist es möglich, transparente Leinwand zu erstellen
- 19. Wie sage ich CMake, um in einer statischen Bibliothek im Quellverzeichnis zu verknüpfen?
- 20. Komponententest mit einer statischen Bibliothek
- 21. Hinzufügen einer statischen Bibliothek zu podspec
- 22. Ist es möglich, Portable VM zu erstellen?
- 23. Manuelles Erstellen eines Frameworks aus der statischen Bibliothek
- 24. Ist es möglich, einen Vorlagenalias zu erstellen?
- 25. Ist es möglich, 2Topics mit derselben Partition zu erstellen?
- 26. Ist es möglich, SQL LINK-Lecks mit LINQ zu bekommen?
- 27. Ist es möglich, Inline-Pseudo-Stile zu erstellen?
- 28. Warum sind Python-Erweiterungen gemeinsam genutzte Bibliotheken? Ist es möglich, eine statisch verknüpfte Bibliothek zu erstellen?
- 29. Ist es möglich, dieses statische private Mitglied einer statischen Klasse mit Reflektion zu setzen?
- 30. Führt das zweimalige Verbinden einer statischen Bibliothek zu einer Duplizierung?
Hatte für sie den gleichen Namen, aber na ja. Eine andere Frage: Kannst du CMake anweisen, statische Bibliotheken wenn möglich in die gemeinsame Bibliothek einzubinden? –
Weitere Informationen zu "gleicher Name": Wenn Sie Windows verwenden und für beide Bibliotheken denselben Namen verwenden möchten und die gemeinsam genutzte .lib-Datei nicht benötigen, können Sie eine statische .lib-Datei und eine freigegebene .dll-Datei erstellen. Sie benötigen diese freigegebene LIB-Datei jedoch, wenn Sie Ihre Bibliothek für die normale Kompilierungszeitverknüpfung verwenden. –
Ich bin mir nicht sicher, ob ich Ihre Frage zum Verknüpfen von statischen Bibliotheken in der gemeinsam genutzten Bibliothek verstehe. –