C++ u CMake - aħwa għal dejjem, parti II

C++ u CMake - aħwa għal dejjem, parti II

Fil-parti ta’ qabel Din l-istorja divertenti tkellmet dwar l-organizzazzjoni ta 'librerija ta' header fi ħdan il-ġeneratur tas-sistema CMake build.

Din id-darba se nżidu librerija miġbura magħha, u nitkellmu wkoll dwar il-konnessjoni ta 'moduli ma' xulxin.

Bħal qabel, dawk li huma paċenzja jistgħu immedjatament mur fir-repożitorju aġġornat u tmiss kollox b'idejk.


Kontenut

  1. Aqsam
  2. Irbaħ

Aqsam

L-ewwel ħaġa li rridu nagħmlu biex nilħqu l-għan għoli tagħna hija li naqsmu s-softwer li niżviluppaw fi blokki universali u iżolati li huma uniformi mill-perspettiva tal-utent.

Fl-ewwel parti, blokka standard bħal din ġiet deskritta - proġett b'librerija header. Issa ejja nżidu librerija kkumpilata mal-proġett tagħna.

Biex tagħmel dan, ejja noħroġ l-implimentazzjoni tal-funzjoni myfunc f'parti separata .cpp-file:

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

Imbagħad niddefinixxu l-librerija li trid tiġi kkumpilata (myfeature), li se jikkonsisti minn dak li nkiseb fil-pass preċedenti .cpp-fajl. Il-librerija l-ġdida ovvjament teħtieġ headers eżistenti, u sabiex tipprovdi dan, tista 'u għandha tkun marbuta mal-iskop eżistenti mylib. Barra minn hekk, il-konnessjoni bejniethom hija pubblika, li jfisser li dak kollu li miegħu se tkun konnessa l-mira myfeature, se tirċievi awtomatikament it-tagħbija u l-mira mylib (aktar dwar metodi tan-knitting).

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

Sussegwentement, niżguraw li l-librerija l-ġdida hija installata wkoll fuq is-sistema:

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

Għandu jiġi nnutat li għall-iskop myfeature, kif għal mylib inħoloq alias bi prefiss Mylib::. L-istess jinkiteb għaż-żewġ għanijiet meta jiġu esportati għall-installazzjoni fuq is-sistema. Dan jagħmilha possibbli li taħdem b'mod uniformi ma 'għanijiet għal kwalunkwe skema vinkolanti.

Wara dan, kulma jibqa 'huwa li tgħaqqad it-testijiet tal-unità mal-librerija l-ġdida (funzjoni myfunc meħuda mit-titlu, allura issa trid tikkollega):

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
 )

Intestaturi (Mylib::mylib) issa m'għandekx bżonn tikkonnettja separatament, għaliex, kif diġà ssemma, huma awtomatikament konnessi flimkien mal-librerija (Mylib::myfeature).

U ejja nżidu ftit sfumaturi biex niżguraw kejl tal-kopertura b'kont meħud tal-librerija li għadha kif waslet:

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

Tista 'żżid aktar libreriji, eżekutibbli, eċċ. Ma jimpurtax kemm huma eżattament konnessi ma 'xulxin fi ħdan il-proġett. L-unika ħaġa importanti hija liema miri huma l-interface tal-modulu tagħna, jiġifieri, joħorġu.

Irbaħ

Issa għandna moduli ta 'blokki standard, u nistgħu niddominawhom: ikkomponihom fi struttura ta' kwalunkwe kumplessità, ninstallahom f'sistema jew torbothom flimkien f'sistema ta 'assemblaġġ waħda.

Installazzjoni fis-sistema

Waħda mill-għażliet għall-użu tal-modulu hija li tinstalla l-modulu tagħna fis-sistema.

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

Wara dan, huwa konness ma 'kwalunkwe proġett ieħor bl-użu tal-kmand find_package.

find_package(Mylib 1.0 REQUIRED)

Konnessjoni bħala submodulu

Għażla oħra hija li tikkonnettja l-folder mal-proġett tagħna ma 'proġett ieħor bħala submodulu bl-użu tal-kmand add_subdirectory.

Użu

Il-metodi li jorbtu huma differenti, iżda r-riżultat huwa l-istess. Fiż-żewġ każijiet, l-għanijiet se jkunu disponibbli fil-proġett bl-użu tal-modulu tagħna Mylib::myfeature и Mylib::mylib, li jistgħu jintużaw, pereżempju, bħal dan:

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

Speċifikament fil-każ tagħna, il-librerija Mylib::myfeature jeħtieġ li jiġu konnessi meta jkun meħtieġ li jgħaqqdu mal-librerija libmyfeature. Jekk hemm biżżejjed headers, allura ta 'min juża l-librerija Mylib::mylib.

Il-miri CMake jistgħu jkunu delikati, pereżempju, maħsuba biss biex jgħaddu xi proprjetajiet, dipendenzi, eċċ. Fl-istess ħin, ix-xogħol magħhom iseħħ bl-istess mod.

Dak hu li kellna bżonn niksbu.

Sors: www.habr.com

Żid kumment