Um unser hohes Ziel zu erreichen, müssen wir zunächst die von uns entwickelte Software in universelle, isolierte Blöcke unterteilen, die aus Benutzersicht einheitlich sind.
Im ersten Teil wurde ein solcher Standardbaustein beschrieben – ein Projekt mit einer Header-Bibliothek. Fügen wir nun unserem Projekt eine kompilierte Bibliothek hinzu.
Nehmen wir dazu die Implementierung der Funktion heraus myfunc in einem separaten .cpp-Datei:
Dann definieren wir die zu kompilierende Bibliothek (myfeature), die aus dem besteht, was im vorherigen Schritt erhalten wurde .cpp-Datei. Die neue Bibliothek erfordert natürlich vorhandene Header, und um diese bereitzustellen, kann und sollte sie an den bestehenden Zweck gebunden werden mylib. Darüber hinaus ist die Verbindung zwischen ihnen öffentlich, was bedeutet, dass alles, mit dem das Ziel verbunden ist, verbunden wird myfeature, erhält automatisch die Last und das Ziel mylib (mehr über Strickmethoden).
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 108045c..0de77b8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,6 +64,17 @@ target_compile_features(mylib INTERFACE cxx_std_17)
add_library(Mylib::mylib ALIAS mylib)
+###################################################################################################
+##
+## Компилируемая библиотека
+##
+###################################################################################################
+
+add_library(myfeature src/mylib/myfeature.cpp)
+target_link_libraries(myfeature PUBLIC mylib)
+
+add_library(Mylib::myfeature ALIAS myfeature)
+
Als nächstes stellen wir sicher, dass die neue Bibliothek auch auf dem System installiert ist:
Es sollte beachtet werden, dass dies der Fall ist myfeature, wie für mylib Es wurde ein Alias mit Präfix erstellt Mylib::. Beim Export zur Installation auf dem System wird für beide Zwecke das Gleiche geschrieben. Dadurch ist es möglich, für jeden einheitlich mit Zielen zu arbeiten Bindungsschema.
Danach müssen nur noch Unit-Tests mit der neuen Bibliothek verknüpft werden (function myfunc aus dem Titel entfernt, also müssen Sie jetzt verlinken):
Überschriften (Mylib::mylib) müssen Sie jetzt keine separate Verbindung mehr herstellen, da diese, wie bereits erwähnt, automatisch zusammen mit der Bibliothek verbunden werden (Mylib::myfeature).
Und fügen wir noch ein paar Nuancen hinzu, um sicherzustellen, dass die Abdeckungsmessungen die neu angekommene Bibliothek berücksichtigen:
Sie können weitere Bibliotheken, ausführbare Dateien usw. hinzufügen. Dabei spielt es keine Rolle, wie genau sie innerhalb des Projekts miteinander verbunden sind. Wichtig ist nur, welche Ziele die Schnittstelle unseres Moduls sind, also hervorstechen.
Jetzt haben wir Standard-Blockmodule, und wir können sie beherrschen: Sie können sie zu einer Struktur beliebiger Komplexität zusammensetzen, sie in ein System einbauen oder sie innerhalb eines einzigen Montagesystems miteinander verbinden.
Einbau in das System
Eine der Möglichkeiten, das Modul zu nutzen, besteht darin, unser Modul in das System zu installieren.
Danach wird es über den Befehl mit einem beliebigen anderen Projekt verbunden find_package.
find_package(Mylib 1.0 REQUIRED)
Anschluss als Submodul
Eine andere Möglichkeit besteht darin, den Ordner mit unserem Projekt über den Befehl als Submodul mit einem anderen Projekt zu verbinden add_subdirectory.
Verwenden
Die Bindungsmethoden sind unterschiedlich, aber das Ergebnis ist das gleiche. In beiden Fällen werden Ziele im Projekt über unser Modul verfügbar sein Mylib::myfeature и Mylib::mylib, was zum Beispiel so verwendet werden kann:
Konkret in unserem Fall die Bibliothek Mylib::myfeature müssen angeschlossen werden, wenn eine Verbindung mit der Bibliothek erforderlich ist libmyfeature. Wenn genügend Header vorhanden sind, lohnt sich die Nutzung der Bibliothek Mylib::mylib.
CMake-Ziele können knifflig sein, da sie beispielsweise nur dazu gedacht sind, einige Eigenschaften, Abhängigkeiten usw. weiterzuleiten. Gleichzeitig erfolgt die Arbeit mit ihnen auf die gleiche Weise.