CMake-Optimierung für statische Bibliotheken

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.


:


  • staticA
  • staticB
  • staticC

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.

Source: https://habr.com/ru/post/undefined/


All Articles