CMake: Verwende Objektdateien, die für eine lib erstellt wurden, in ein anderes lib-Ziel
Ich versuche mich zu bewegen, mein Projekt auf CMake, und zur gleichen Zeit haben einige Optimierungen auf die Kompilierung.
Hier ist der deal:
- Ich habe mehrere Unterverzeichnisse, die sind (müssen), jeweils zusammengestellt in einer statischen Bibliothek (dies funktioniert).
- Ich will sammeln alle Objekt-Dateien aus jedem Ordner in eine andere größere, komplette, statische Bibliothek.
Sieht es wie folgt aus:
.
libBig.a # made from object from subdir1 and subdir2
subdir1/
src/
libSubdir1.a
subdir2/
src/
libSubdir2.a
Heute habe ich es geschafft eine Globale variable verwenden, in der jede subdir CMakeLists.txt angefügt werden Ihre eigenen Quelldateien. Ich benutze diese variable als "source" den Eingang in mein big-Bibliothek:
# the big library depends on all the source files
# ${all_src} is automatically filled with each subdir's cpp file
get_property( BigLib_src GLOBAL PROPERTY all_src)
add_library( Big STATIC ${BigLib_src}) # recompiles all the sources
Nun, das funktioniert, nicht schlecht, aber die Sache ist, alle meine source-Dateien kompiliert zweimal: einmal für den Ordner Bibliothek, und einmal für die große Bibliothek.
CMake scheint zu vergessen, dass es bereits gebaut.
Ich haben zu halten, den Ordner Bibliotheken und ar
kann nicht Zusammenführen von zwei statische Bibliotheken.
Wissen Sie, wie Sie das tun?
InformationsquelleAutor der Frage Gui13 | 2011-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die neue OBJEKT-Bibliothek feature eingeführt, in CMake 2.8.8. Die Idee ist, erklärt hier. Grundsätzlich werden die OBJEKT-Bibliothek ist ein ähnliches Konzept wie der convenience-Bibliothek bekannt aus Autotools, group-object-Dateien.
Überprüfen Sie die vollständige CMake OBJEKT-Bibliothek-tutorial.
InformationsquelleAutor der Antwort mloskot
Als von CMake 2.8.8, Sie können dies tun, mit der
OBJECT
Bibliothek geben. Sehen mloksot ist Antwort. Die alte situation war, dass jedes Ziel hatte seinen eigenen Verzeichnis und CMake bauen würde jedes abhängige Objekt für jedes Ziel. Dies schützt vor einem Fall, wo eine Quelle-Datei kann verwendet werden, mehrere Male mit verschiedenenCFLAGS
. (Beachten Sie, dass standardmäßig CMake ist konservativer als automake hier: automake wird stop-die Wiederverwendung von Objekt-Dateien für verschiedene Ziele nur, wenn die Ziele gebaut werden, mit verschiedenenCFLAGS
(und wahrscheinlichCPPFLAGS
auch).InformationsquelleAutor der Antwort Jack Kelly