Het eerste wat we moeten doen om ons verheven doel te bereiken is de software die we ontwikkelen op te delen in universele, geΓ―soleerde blokken die uniform zijn vanuit het gezichtspunt van de gebruiker.
In het eerste deel werd zo'n standaardblok beschreven: een project met een headerbibliotheek. Laten we nu een gecompileerde bibliotheek aan ons project toevoegen.
Om dit te doen, nemen we de implementatie van de functie eruit myfunc in een aparte .cpp-bestand:
Vervolgens definiΓ«ren we de te compileren bibliotheek (myfeature), die zal bestaan ββuit wat in de vorige stap is verkregen .cpp-bestand. De nieuwe bibliotheek heeft uiteraard bestaande headers nodig, en om hierin te voorzien kan en moet deze aan het bestaande doel worden gekoppeld mylib. Bovendien is de verbinding daartussen openbaar, wat betekent dat alles waarmee het doelwit verbonden zal zijn myfeature, ontvangt automatisch de lading en het doel mylib (meer over breimethoden).
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)
+
Vervolgens zorgen we ervoor dat de nieuwe bibliotheek ook op het systeem wordt geΓ―nstalleerd:
Opgemerkt moet worden dat voor het doel myfeature, wat betreft mylib er is een alias met een voorvoegsel gemaakt Mylib::. Hetzelfde is voor beide doeleinden geschreven bij het exporteren voor installatie op het systeem. Hierdoor is het mogelijk om uniform te werken met doelstellingen voor iedereen bindend schema.
Hierna rest alleen nog het koppelen van unittests aan de nieuwe bibliotheek (function myfunc uit de titel gehaald, dus nu moet je linken):
Koppen (Mylib::mylib) nu hoef je niet apart verbinding te maken, omdat ze, zoals eerder vermeld, automatisch samen met de bibliotheek zijn verbonden (Mylib::myfeature).
En laten we een paar nuances toevoegen om dekkingsmetingen te garanderen, rekening houdend met de nieuw aangekomen bibliotheek:
U kunt meer bibliotheken, uitvoerbare bestanden, enz. toevoegen. Hoe ze binnen het project precies met elkaar verbonden zijn, maakt niet uit. Het enige belangrijke is welke doelen de interface van onze module zijn, dat wil zeggen dat ze uitsteken.
Nu hebben we standaard blokmodules, en we kunnen ze domineren: ze samenstellen tot een structuur van elke complexiteit, ze in een systeem installeren of ze aan elkaar koppelen binnen een enkel assemblagesysteem.
Daarna wordt het met behulp van de opdracht verbonden met elk ander project find_package.
find_package(Mylib 1.0 REQUIRED)
Aansluiting als submodule
Een andere optie is om de map met ons project als submodule aan een ander project te koppelen met behulp van de opdracht add_subdirectory.
Gebruiken
De bindmethoden zijn verschillend, maar het resultaat is hetzelfde. In beide gevallen zullen doelen beschikbaar zijn in het project met behulp van onze module Mylib::myfeature ΠΈ Mylib::mylib, die bijvoorbeeld als volgt kan worden gebruikt:
In ons geval specifiek de bibliotheek Mylib::myfeature moeten verbonden zijn wanneer het nodig is om te koppelen met de bibliotheek libmyfeature. Als er voldoende headers zijn, is het de moeite waard om de bibliotheek te gebruiken Mylib::mylib.
CMake-doelen kunnen lastig zijn, bijvoorbeeld alleen bedoeld om bepaalde eigenschappen, afhankelijkheden, enz. door te geven. Tegelijkertijd gebeurt het werken met hen op dezelfde manier.