C++ ir CMake – broliai amžinai, II dalis

C++ ir CMake – broliai amžinai, II dalis

Ankstesnėje dalyje Šioje linksmoje istorijoje buvo kalbama apie antraštės bibliotekos sutvarkymą CMake kūrimo sistemos generatoriuje.

Šį kartą prie jo pridėsime sudarytą biblioteką, taip pat kalbėsime apie modulių susiejimą tarpusavyje.

Kaip ir anksčiau, nekantrūs gali iš karto eikite į atnaujintą saugyklą ir viską liesti savo rankomis.


Turinys

  1. Padalinti
  2. Užkariauti

Padalinti

Pirmas dalykas, kurį turime padaryti, kad pasiektume savo aukštą tikslą, yra padalinti mūsų kuriamą programinę įrangą į universalius, izoliuotus blokus, kurie būtų vienodi vartotojo požiūriu.

Pirmoje dalyje buvo aprašytas toks standartinis blokas – projektas su antraščių biblioteka. Dabar prie projekto pridėkime sudarytą biblioteką.

Norėdami tai padaryti, išimkime funkcijos įgyvendinimą myfunc atskirame .cpp-failas:

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;
+    }
+}

Tada apibrėžiame biblioteką, kurią reikia sudaryti (myfeature), kurį sudarys tai, kas buvo gauta ankstesniame žingsnyje .cpp-failas. Akivaizdu, kad naujai bibliotekai reikalingos esamos antraštės, o norint tai suteikti, ji gali ir turi būti susieta su esama paskirtimi mylib. Be to, ryšys tarp jų yra viešas, o tai reiškia, kad viskas, su kuo bus prijungtas taikinys myfeature, automatiškai gaus apkrovą ir tikslą mylib (daugiau apie mezgimo būdus).

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

Tada įsitikinsime, kad nauja biblioteka taip pat įdiegta sistemoje:

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

Reikėtų pažymėti, kad tikslu myfeature, kalbant apie mylib buvo sukurtas slapyvardis su priešdėliu Mylib::. Tas pats parašyta abiem tikslams eksportuojant juos įdiegti sistemoje. Tai leidžia vienodai dirbti su bet kokiu tikslu privaloma schema.

Po to belieka susieti vienetų testus su nauja biblioteka (funkcija myfunc išimtas iš pavadinimo, todėl dabar reikia susieti):

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
 )

Antraštės (Mylib::mylib) dabar jums nereikia jungtis atskirai, nes, kaip jau minėta, jie automatiškai prijungiami kartu su biblioteka (Mylib::myfeature).

Pridėkime keletą niuansų, kad būtų užtikrintas aprėpties matavimas, atsižvelgiant į naujai gautą biblioteką:

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

Galite pridėti daugiau bibliotekų, vykdomųjų failų ir kt. Nesvarbu, kaip tiksliai jie yra sujungti vienas su kitu projekte. Svarbu tik tai, kurie tikslai yra mūsų modulio sąsaja, tai yra, jie išsikiša.

Užkariauti

Dabar turime standartinius blokinius modulius ir galime juose dominuoti: sudaryti juos į bet kokio sudėtingumo struktūrą, sumontuoti į sistemą arba sujungti į vieną surinkimo sistemą.

Įdiegimas į sistemą

Viena iš modulio naudojimo galimybių yra įdiegti mūsų modulį sistemoje.

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

Po to jis prijungiamas prie bet kurio kito projekto naudojant komandą find_package.

find_package(Mylib 1.0 REQUIRED)

Ryšys kaip submodulis

Kita galimybė yra prijungti aplanką su mūsų projektu prie kito projekto kaip submodulį naudojant komandą add_subdirectory.

Naudoti

Įrišimo būdai yra skirtingi, tačiau rezultatas yra tas pats. Abiem atvejais tikslai bus pasiekiami projekte naudojant mūsų modulį Mylib::myfeature и Mylib::mylib, kurį galima naudoti, pavyzdžiui, taip:

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

Konkrečiai mūsų atveju – biblioteka Mylib::myfeature reikia prijungti, kai reikia susieti su biblioteka libmyfeature. Jei yra pakankamai antraščių, verta naudotis biblioteka Mylib::mylib.

„CMake“ tikslai gali būti sudėtingi, pavyzdžiui, skirti tik kai kurioms ypatybėms, priklausomybėms ir kt. Tuo pačiu metu darbas su jais vyksta taip pat.

Štai ką mums reikėjo gauti.

Šaltinis: www.habr.com

Добавить комментарий