Wahrscheinlich wartet keiner von uns gerne lange auf den Abschluss der Projektmontage, wenn jede Sekunde wie eine Ewigkeit ist. Und es ist gut, wenn es Arbeitszeit ist, und Sie können sich die Zeit mit einem Glas Kaffee vertreiben und alle Mängel der automatischen Müllabfuhr besprechen.
Manchmal kann ein bestimmter Erfolg durch die Durchführung einer CMake-Optimierung erzielt werden. Die hier betrachtete Technik basiert auf einer einfachen Idee: Zwei statische Bibliotheken, die die Funktionen des anderen verwenden, können gleichzeitig zusammengestellt werden.
Ein bisschen Anatomie
Betrachten Sie zunächst die grundlegenden Schritte zum Erstellen einer statischen Bibliothek:
- Präprozessor - Entfernt alle Kommentare aus Quelldateien, fügt Header-Dateien ein und ersetzt Makros durch berechnete Werte.
- Compiler - konvertiert die vom Präprozessor verarbeiteten Dateien in Assembler-Code.
- Assembler - übersetzt Assembler-Code in Maschinencode; Das Ergebnis wird als Objektdatei gespeichert.
- Archivierer - Sammeln Sie Objektdateien in einem einzigen Archiv.
Grafisch sind diese Schritte im Diagramm dargestellt:
, . , . . , , .
, , CMake target_link_libraries. :
target_link_libraries(staticC PRIVATE staticB)
, — staticC
staticB
. , , , staticC
, staticB
.
, CoherentDeps, :
, staticC
staticB
, .
, , , ( , ) INTERFACE
, -meta ( , ). , -, .
target_link_libraries
.
, :
: NonCoherentDeps.
:
NonCoherentDeps
.
staticB
staticA
, staticC
staticB
, NonCoherentDeps
staticC
. :
CMake- staticA
- :
add_library(staticA-meta INTERFACE)
target_include_directories(staticA-meta INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}")
, :
target_link_libraries(staticA PUBLIC staticA-meta)
staticB
CMake
target_link_libraries(staticB PRIVATE staticA)
:
target_link_libraries(staticB PRIVATE staticA-meta)
staticA
staticB
, . staticB
staticA
.
:
— :
add_executable(NonCoherentDeps main.cpp)
target_link_libraries(NonCoherentDeps PRIVATE staticC staticB staticA )
, .
, staticA
, target_include_directories. NonCoherentDeps, :
target_include_directories(staticB PRIVATE "${path_to_headers_in_staticA}")
:
target_link_libraries(staticB PRIVATE staticA-meta)
, staticB
staticA
, staticC
:
target_include_directories(staticC PRIVATE "${path_to_headers_in_staticB}" "${path_to_headers_in_staticA}")
. :
target_link_libraries(staticB-meta INTERFACE staticA-meta)
staticC
:
target_link_libraries(staticC INTERFACE staticB-meta)
staticB
, , .
Außerdem können Sie im Metapaket eine Abhängigkeit in Form eines Befehls zum Generieren von Header-Dateien hinzufügen, und die Eigenschaften sind korrekte Pfade.