Pirmā lieta, kas mums jādara, lai sasniegtu mūsu augsto mērķi, ir sadalīt mūsu izstrādāto programmatūru universālos, izolētos blokos, kas ir vienādi no lietotāja viedokļa.
Pirmajā daļā tika aprakstīts šāds standarta bloks - projekts ar galvenes bibliotēku. Tagad pievienosim mūsu projektam apkopotu bibliotēku.
Lai to izdarītu, izņemsim funkcijas ieviešanu myfunc atsevišķā .cpp-fails:
Pēc tam mēs definējam kompilējamo bibliotēku (myfeature), kas sastāvēs no iepriekšējā darbībā iegūtā .cpp- fails. Jaunajai bibliotēkai acīmredzami ir vajadzīgas esošās galvenes, un, lai to nodrošinātu, to var un vajadzētu piesaistīt esošajam mērķim mylib. Turklāt savienojums starp tiem ir publisks, kas nozīmē, ka viss, ar ko tiks savienots mērķis myfeature, automātiski saņems slodzi un mērķi mylib (vairāk par adīšanas metodēm).
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)
+
Tālāk mēs pārliecināsimies, ka sistēmā ir instalēta arī jaunā bibliotēka:
Jāatzīmē, ka šim nolūkam myfeature, kas attiecas uz mylib tika izveidots aizstājvārds ar prefiksu Mylib::. Tas pats ir rakstīts abiem mērķiem, eksportējot tos instalēšanai sistēmā. Tas ļauj vienmērīgi strādāt ar mērķiem jebkuram saistošā shēma.
Pēc tam atliek vien saistīt vienību testus ar jauno bibliotēku (funkcija myfunc izņemts no virsraksta, tāpēc tagad jums ir jāsaista):
Virsraksti (Mylib::mylib) tagad jums nav nepieciešams atsevišķi izveidot savienojumu, jo, kā jau minēts, tie tiek automātiski savienoti kopā ar bibliotēku (Mylib::myfeature).
Un pievienosim dažas nianses, lai nodrošinātu pārklājuma mērījumus, ņemot vērā tikko ienākošo bibliotēku:
Varat pievienot vairāk bibliotēku, izpildāmos failus utt. Nav svarīgi, cik precīzi tie ir saistīti viens ar otru projekta ietvaros. Vienīgais svarīgais ir tas, kuri mērķi ir mūsu moduļa saskarne, tas ir, tie izceļas.
Tagad mums ir standarta bloku moduļi, un mēs varam tajos dominēt: izveidot tos jebkuras sarežģītības struktūrā, instalējot tos sistēmā vai savienojot tos vienā montāžas sistēmā.
Uzstādīšana sistēmā
Viena no moduļa izmantošanas iespējām ir mūsu moduļa instalēšana sistēmā.
Pēc tam tas tiek savienots ar jebkuru citu projektu, izmantojot komandu find_package.
find_package(Mylib 1.0 REQUIRED)
Savienojums kā apakšmodulis
Vēl viena iespēja ir savienot mapi ar mūsu projektu ar citu projektu kā apakšmoduli, izmantojot komandu add_subdirectory.
Izmantot
Iesiešanas metodes ir dažādas, bet rezultāts ir vienāds. Abos gadījumos mērķi būs pieejami projektā, izmantojot mūsu moduli Mylib::myfeature и Mylib::mylib, ko var izmantot, piemēram, šādi:
Konkrēti mūsu gadījumā — bibliotēka Mylib::myfeature jābūt savienotam, ja nepieciešams izveidot saiti ar bibliotēku libmyfeature. Ja galvenes ir pietiekami daudz, tad ir vērts izmantot bibliotēku Mylib::mylib.
CMake mērķi var būt sarežģīti, piemēram, paredzēti tikai dažu rekvizītu, atkarību utt. pārsūtīšanai. Tajā pašā laikā darbs ar viņiem notiek tādā pašā veidā.