2010-12-11 3 views
7

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:

  1. Ich konnte kein CMake Variable finden, die den vollqualifizierten Pfad zum LINK.EXE ausführbare anzeigt. Ich müsste dann irgendwie den Pfad zu LINK.EXE mit einer zerbrechlichen Heuristik ableiten: Es ist fragil in dem Sinne, dass verschiedene Visual Studio-Versionen die LINK.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.
  2. 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 ein FILE(GLOB...)-Konstrukt in diesem Fall meine beste zweite Alternative wäre.
  3. 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, dass LINK.EXE einige OBJ-Dateien aus lib1.lib lib2.lib ... lässt, ohne dass Diagnosemeldungen erklären, warum, so ist dieser Ansatz ein Nichtstarter); Die Online-Dokumente für LINK.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.

Antwort

10

Erstellen Sie eine statische Bibliothek "fusioniert" mit einer Dummy-Quelldatei, und fügen Sie libs zum Zusammenführen zu den STATIC_LIBRARY_FLAGS hinzu, so dass sie zusätzliche Eingaben für lib.exe sind.

Das wäre so etwas wie:

ADD_LIBRARY

SET_TARGET_PROPERTIES (fusioniert PROPERTIES
STATIC_LIBRARY_FLAGS „full \ Pfad (STATIC dummy.c fusionierte) \ lib1.lib voll \ path \ to \ lib2 \ .lib ")

Dieser Ansatz wird in MySQL verwendet, es gibt hier ein allgemeineres Makro zum Zusammenführen statischer Bibliotheken, das mit crosss-platform funktioniert. Es kann hier gefunden werden http://www.mail-archive.com/[email protected]/msg28670/libutils.cmake

+0

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

+0

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 –

Verwandte Themen