C++ ja CMake – vennad igaveseks, osa II

C++ ja CMake – vennad igaveseks, osa II

Eelnevas osas selles põnevas loos räägiti CMake süsteemide koostamise generaatori raames pealkirjade teegi korraldamisest.

Seekord lisame sellele kompileeritava teegi ning räägime ka moodulite omavahelistest ühendustest.

Nagu varemgi, võivad need, kes ei suuda oodata, otse uuendatud hoidlasse minna ja kõike ise käes katsuda.


Sisu

  1. Jaota
  2. Valitse

Jaota

Esimene asi, mida meie kõrge eesmärgi saavutamiseks teha, on arendatav tarkvara jagamine universaalseteks isoleeritud blokideks, mis on kasutaja vaatenurgast ühtsed.

Esimeses osas kirjeldati sellist tavalist plokki – projekti pealkirjade teegiga. Nüüd lisame meie projektile kompileeritava teegi.

Selleks viime funktsiooni myfunc eraldi .cpp-faili:

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

         ~  vaata 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 
+
+namespace mylib
+{
+    bool myfunc (mystruct)
+    {
+        return true;
+    }
+}

Seejärel määratleme kompileeritava teegi (myfeature), mis koosneb eelmisel sammul saadud .cpp-failist. Uuel teegil on arusaadavalt vaja juba olemasolevaid pealkirju, ja selle tagamiseks tuleb see siduda olemasoleva sihiga mylib. Sidumine nende vahel on avalik, mis tähendab, et kõik, millele siht on ühendatud, myfeaturesaab automaatselt sihiga seotud ka mylib (rohkem sidumismeetoditest).

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)

+###################################################################################################
+##
+##      Kompileeritav raamatukogu
+##
+###################################################################################################
+
+add_library(myfeature src/mylib/myfeature.cpp)
+target_link_libraries(myfeature PUBLIC mylib)
+
+add_library(Mylib::myfeature ALIAS myfeature)
+

Edasi liikudes teeme nii, et uus raamatukogu installitakse ka süsteemi:

@@ -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 tähele panna, et sihtmärgi myfeature, nagu ka mylib oli registreeritud alias eelseisvale Mylib::. Sama on üles kirjutatud mõlema sihtmärgi jaoks nende eksportimisel süsteemi installimiseks. See annab võimaluse ühtlaseks töötamiseks sihtmärkidega igasuguste sidumisskeemide.

Pärast seda jäi veel siduda moodulitestidega uus raamatukogu (funktsioon myfunc viidi pealkirjast välja, nii et nüüd tuleb linkida):

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) ei pea nüüd eraldi importima, sest nagu juba öeldud, on need automaatselt koos raamatukoguga ühendatud (Mylib::myfeature).

Ja lisame paar nüanssi, et tagada kaetud mõõdud uue raamatukogu arvestamisel:

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

Võib lisada rohkem raamatukogusid, täitevfaile jne. Oluline on, kuidas nad on omavahel ühendatud projekti raames. Oluline on ainult see, millised eesmärgid on meie mooduli liides, see tähendab, mis on väljas.

Valitse

Nüüd on meil standardmudelid ja me saame neid hallata: luua neist mis tahes keerukusega struktuure, paigaldades need süsteemi või omavahel sidudes ühtse kogumissüsteemi raames.

Paigaldamine süsteemi

Üks mudeli kasutamise võimalusi on meie mudeli paigaldamine süsteemi.

cmake --build tee/koostamis/kaust --target install

Pärast seda saab seda kasutada mis tahes teises projektis käsureaga find_package.

find_package(Mylib 1.0 REQUIRED)

Alamoodulina ühendamine

Teine võimalus on ühendada oma projekti kaust teise projekti alamoodulina, kasutades käsku add_subdirectory.

Kasutamine

Sidumise viise on erinevaid, kuid tulemus on sama. Nii ühes kui teises juhul on projektis, mis kasutab meie mudelit, saadaval sihid Mylib::myfeature ja Mylib::mylib, mida saab kasutada näiteks nii:

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

Konkreetsemalt peab meie puhul raamatukogu Mylib::myfeature olema ühendatud siis, kui on vajalik linkida raamatukoguga libmyfeature. Kui piisab pealkirjadest, siis tuleks kasutada raamatukogu Mylib::mylib.

CMake'i sihid võivad olla petlikud, näiteks mõeldud ainult mõne omaduse, sõltuvuste jms edastamiseks. Sellegipoolest toimub nendega töötamine ühtselt.

Just seda oli vaja saavutada.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster