C++ i CMake - braća zauvijek, II dio

C++ i CMake - braća zauvijek, II dio

U prethodnom dijelu Ova zabavna priča govorila je o organiziranju biblioteke zaglavlja unutar CMake generatora sustava za izgradnju.

Ovaj put ćemo mu dodati kompiliranu biblioteku, a također ćemo razgovarati o međusobnom povezivanju modula.

Kao i do sada, nestrpljivi mogu odmah idite na ažurirano spremište i sve dotakni vlastitim rukama.


sadržaj

  1. Podijeliti
  2. Osvojiti

Podijeliti

Prva stvar koju trebamo učiniti kako bismo postigli naš uzvišeni cilj je podijeliti softver koji razvijamo u univerzalne, izolirane blokove koji su jedinstveni s korisnikove točke gledišta.

U prvom dijelu opisan je takav standardni blok - projekt s bibliotekom zaglavlja. Dodajmo sada kompiliranu biblioteku našem projektu.

Da bismo to učinili, izvadimo implementaciju funkcije myfunc u zasebnom .cpp-datoteka:

diff --git a/include/mylib/myfeature.hpp b/include/mylib/myfeature.hpp
index 43db388..ba62b4f 100644
--- a/include/mylib/myfeature.hpp
+++ b/include/mylib/myfeature.hpp
@@ -46,8 +46,5 @@ namespace mylib

         ~  see mystruct
      */
-    inline bool myfunc (mystruct)
-    {
-        return true;
-    }
+    bool myfunc (mystruct);
 }
diff --git a/src/mylib/myfeature.cpp b/src/mylib/myfeature.cpp
new file mode 100644
index 0000000..abb5004
--- /dev/null
+++ b/src/mylib/myfeature.cpp
@@ -0,0 +1,9 @@
+#include <mylib/myfeature.hpp>
+
+namespace mylib
+{
+    bool myfunc (mystruct)
+    {
+        return true;
+    }
+}

Zatim definiramo biblioteku koju ćemo sastaviti (myfeature), koji će se sastojati od onoga što je dobiveno u prethodnom koraku .cpp-datoteka. Nova biblioteka očito zahtijeva postojeća zaglavlja, a kako bi to omogućila, može i treba biti vezana za postojeću svrhu mylib. Štoviše, veza između njih je javna, što znači da je sve na što će meta biti povezano myfeature, automatski će primiti opterećenje i cilj mylib (više o metodama pletenja).

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)
+

Zatim ćemo provjeriti je li nova biblioteka također instalirana na sustavu:

@@ -72,7 +83,7 @@ add_library(Mylib::mylib ALIAS mylib)

 install(DIRECTORY include/mylib DESTINATION include)

-install(TARGETS mylib EXPORT MylibConfig)
+install(TARGETS mylib myfeature EXPORT MylibConfig)
 install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)

 include(CMakePackageConfigHelpers)

Valja napomenuti da u svrhu myfeature, Što se tiče mylib stvoren je alias s prefiksom Mylib::. Isto je napisano za obje namjene prilikom izvoza za instalaciju na sustav. To omogućuje ujednačen rad s ciljevima za sve shema vezanja.

Nakon toga ostaje samo povezati jedinične testove s novom bibliotekom (funkcija myfunc izbačeno iz naslova, pa sad treba link):

diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 5620be4..bc1266c 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -4,7 +4,7 @@ add_executable(mylib-unit-tests test_main.cpp)
 target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)
 target_link_libraries(mylib-unit-tests
     PRIVATE
-        Mylib::mylib
+        Mylib::myfeature
         doctest::doctest
 )

Naslovi (Mylib::mylib) sada se ne morate spajati odvojeno, jer, kao što je već spomenuto, automatski se povezuju zajedno s bibliotekom (Mylib::myfeature).

I dodajmo nekoliko nijansi kako bismo osigurali mjerenja pokrivenosti uzimajući u obzir novopristiglu knjižnicu:

@@ -15,11 +15,16 @@ if(MYLIB_COVERAGE AND GCOVR_EXECUTABLE)
     target_compile_options(mylib-unit-tests PRIVATE --coverage)
     target_link_libraries(mylib-unit-tests PRIVATE gcov)

+    target_compile_options(myfeature PRIVATE --coverage)
+    target_link_libraries(myfeature PRIVATE gcov)
+
     add_custom_target(coverage
         COMMAND
             ${GCOVR_EXECUTABLE}
-                --root=${PROJECT_SOURCE_DIR}/include/
-                --object-directory=${CMAKE_CURRENT_BINARY_DIR}
+                --root=${PROJECT_SOURCE_DIR}/
+                --filter=${PROJECT_SOURCE_DIR}/include
+                --filter=${PROJECT_SOURCE_DIR}/src
+                --object-directory=${PROJECT_BINARY_DIR}
         DEPENDS
             check
     )

Možete dodati više biblioteka, izvršnih datoteka itd. Nije bitno kako su točno međusobno povezani unutar projekta. Važno je samo koje mete su sučelje našeg modula, odnosno strše.

Osvojiti

Sada imamo standardne blok module i možemo dominirati njima: komponirati ih u strukturu bilo koje složenosti, instalirati ih u sustav ili ih povezati u jedan montažni sustav.

Ugradnja u sustav

Jedna od mogućnosti korištenja modula je ugradnja našeg modula u sustav.

cmake --build путь/к/сборочной/директории --target install

Nakon toga se pomoću naredbe povezuje s bilo kojim drugim projektom find_package.

find_package(Mylib 1.0 REQUIRED)

Veza kao podmodul

Druga mogućnost je povezati mapu s našim projektom s drugim projektom kao podmodul pomoću naredbe add_subdirectory.

Koristiti

Metode vezivanja su različite, ali rezultat je isti. U oba slučaja, ciljevi će biti dostupni u projektu pomoću našeg modula Mylib::myfeature и Mylib::mylib, koji se može koristiti, na primjer, ovako:

add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)

Konkretno u našem slučaju, knjižnica Mylib::myfeature potrebno povezati kada je potrebno povezati se s knjižnicom libmyfeature. Ako ima dovoljno zaglavlja, onda je vrijedno koristiti biblioteku Mylib::mylib.

CMake ciljevi mogu biti nezgodni, na primjer, namijenjeni samo prosljeđivanju nekih svojstava, ovisnosti itd. Istodobno, rad s njima odvija se na isti način.

To je ono što smo trebali dobiti.

Izvor: www.habr.com

Dodajte komentar