Im Zusammenhang mit using cmake to link object files into lib.xxxx.a file, aber nicht ganz das Gleiche, habe ich mehrere statische Bibliotheken unter Windows mit CMake 2.8.x mit VS2008 SP1 erstellt . Gibt es einen Weg über CMake, alle .obj-Dateien in all diesen bestehenden statischen Bibliotheken in einer größeren monolithischen Bibliothek zu verknüpfen, vorzugsweise über die CMake-Funktion add_library
oder ein anderes ähnliches Konstrukt?Verknüpfen mehrerer statischer LIB-Dateien in einer monolithischen LIB-Datei mit VS2008 SP1 mit CMake 2.8.x
Ich denke, die Antwort ist „nein“, und so habe ich dachte an meine eigene über einen benutzerdefinierten Befehl über die üblichen add_custom_command
+ add_custom_target
Ansatz Walzen, die einfach konstruiert die Bibliothek manuell, durch alle anderen Bibliotheken liefert OBJ Dateien beim Aufruf LINK.EXE
. Aber ich sehe einige Probleme mit diesem Ansatz:
- Ich konnte kein CMake Variable finden, die den vollqualifizierten Pfad zum
LINK.EXE
ausführbare anzeigt. Ich müsste dann irgendwie den Pfad zuLINK.EXE
mit einer zerbrechlichen Heuristik ableiten: Es ist fragil in dem Sinne, dass verschiedene Visual Studio-Versionen dieLINK.EXE
Datei in verschiedenen Verzeichnissen finden können, und ich brauche das für 32-Bit und 64-Bit-Windows-Compiler-Bedingungen, und widerstandsfähig gegen Upgrades zwischen VS2008 und zukünftigen Compiler-Revisionen. - müsste ich einen Weg finden, alle der OBJ-Dateien der anderen statischen Bibliotheken zu finden, bei der Erstellung gegen bei CMake Zeit, da die OBJ-Dateien natürlich in CMake Zeit nicht (immer) existieren. Aus Gründen der Build-Leistung möchte ich nicht darauf zurückgreifen, die .obj-Dateien aus den .lib-Dateien zu extrahieren, um sie der
LINK.EXE
-Befehlszeile hinzuzufügen, sodass einFILE(GLOB...)
-Konstrukt in diesem Fall meine beste zweite Alternative wäre. - Es kann möglich sein, einfach
LINK.EXE
anrufen über:LINK.EXE /OUT:monolithic.lib lib1.lib lib2.lib ...
, aber vielleicht nicht alle OBJ-Wille (EDIT enthalten sein: Ich habe bestätigt, dassLINK.EXE
einige OBJ-Dateien auslib1.lib lib2.lib ...
lässt, ohne dass Diagnosemeldungen erklären, warum, so ist dieser Ansatz ein Nichtstarter); Die Online-Dokumente fürLINK.EXE
sind in diesem Punkt unklar. Hat jemand Erfahrung damit,LINK.EXE
auf diese Weise zu verwenden?
Danke,
Brent
P. S., ich weiß, wie eine DLL mit CMake erstellen, aber ich ausdrücklich nicht wollen, in der Zeit an dieser Stelle für den Aufbau einer DLL greifen.
MERGE_STATIC_LIBS Makro in der http://www.mail-archive.com/[email protected]/msg28670/libutils definiert.cmake link ist sehr nah an dem, was ich implementiert hätte. Eine Warnung: Dieser Link verweist auf eine Datei, die mysql-spezifisch ist, also müsste sie verallgemeinert werden, damit sie in der Praxis funktioniert. – bgoodr
Das obige libutils.cmake funktioniert in der Tat nicht als eigenständiges Programm, da es auf konfigurierbare merge_archives_unix.cmake.in verweist. Diese Datei ist verfügbar unter http://www.mail-archive.com/[email protected]/msg28670/merge_archives_unix.cmake. im –