C++ ja CMake – vennad igavesti, II osa

C++ ja CMake – vennad igavesti, II osa

Eelmises osas See meelelahutuslik lugu rääkis päiseteegi korraldamisest CMake'i ehitussüsteemi generaatoris.

Seekord lisame sellele koostatud teegi ning räägime ka moodulite omavahelist sidumisest.

Nagu varemgi, saavad kannatamatud kohe minge värskendatud hoidlasse ja puudutage kõike oma kätega.


Sisu

  1. Jaga
  2. Valluta

Jaga

Esimene asi, mida peame oma kõrge eesmärgi saavutamiseks tegema, on jagada meie arendatav tarkvara universaalseteks, isoleeritud plokkideks, mis on kasutaja seisukohast ühtsed.

Esimeses osas kirjeldati sellist standardplokki - päise raamatukoguga projekti. Nüüd lisame oma projektile koostatud raamatukogu.

Selleks võtame välja funktsiooni rakendamise myfunc eraldi .cpp- fail:

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

Seejärel määratleme kompileeritava raamatukogu (myfeature), mis koosneb eelmises etapis saadust .cpp- fail. Ilmselgelt vajab uus teek olemasolevaid päiseid ja selle pakkumiseks saab ja peaks olema seotud olemasoleva eesmärgiga mylib. Pealegi on nendevaheline seos avalik, mis tähendab, et kõik, millega sihtmärk ühendatakse myfeature, saab automaatselt koormuse ja sihtmärgi mylib (rohkem kudumismeetodite kohta).

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

Järgmisena veendume, et uus teek oleks ka süsteemi installitud:

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

Tuleb märkida, et selleks myfeature, nagu mylib loodi eesliitega alias Mylib::. Sama on kirjutatud mõlema eesmärgi kohta, kui neid süsteemi installimiseks eksportida. See võimaldab töötada ühetaoliselt eesmärkidega mis tahes jaoks siduv skeem.

Pärast seda jääb üle vaid linkida ühikutestid uue teegiga (funktsioon myfunc pealkirjast välja võetud, nii et nüüd peate linkima):

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
 )

Pealkirjad (Mylib::mylib) nüüd ei pea te eraldi ühendust looma, sest nagu juba mainitud, ühendatakse need automaatselt koos teegiga (Mylib::myfeature).

Ja lisame paar nüanssi, et tagada katvuse mõõtmised, võttes arvesse äsja saabunud raamatukogu:

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

Saate lisada rohkem teeke, käivitatavaid faile jne. Pole tähtis, kui täpselt need projekti raames omavahel seotud on. Ainus oluline on see, millised sihtmärgid on meie mooduli liides, see tähendab, et need paistavad välja.

Valluta

Nüüd on meil standardsed plokkmoodulid ja me saame nende üle domineerida: koostada need mis tahes keerukusega struktuuriks, paigaldada need süsteemi või siduda need ühte koostesüsteemi.

Paigaldamine süsteemi

Üks mooduli kasutamise võimalustest on meie mooduli paigaldamine süsteemi.

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

Pärast seda ühendatakse see käsu abil mis tahes muu projektiga find_package.

find_package(Mylib 1.0 REQUIRED)

Ühendus alammoodulina

Teine võimalus on ühendada meie projektiga kaust käsu abil alammoodulina teise projektiga add_subdirectory.

Kasutama

Köitmismeetodid on erinevad, kuid tulemus on sama. Mõlemal juhul on eesmärgid meie mooduli abil projektis saadaval Mylib::myfeature и Mylib::mylib, mida saab kasutada näiteks järgmiselt:

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

Täpsemalt meie puhul raamatukogu Mylib::myfeature tuleb ühendada, kui on vaja raamatukoguga linkida libmyfeature. Kui päiseid on piisavalt, siis tasub raamatukogu kasutada Mylib::mylib.

CMake'i sihtmärgid võivad olla keerulised, näiteks mõeldud ainult teatud atribuutide, sõltuvuste jne edastamiseks. Samal ajal toimub nendega töötamine samamoodi.

See on see, mida me pidime saama.

Allikas: www.habr.com

Lisa kommentaar