C++ eta CMake - anaiak betiko, II

C++ eta CMake - anaiak betiko, II

Aurreko zatian Istorio dibertigarri honek CMake build system generator barruan goiburuko liburutegi bat antolatzeari buruz hitz egin zuen.

Oraingoan liburutegi konpilatua gehituko diogu, eta moduluak elkarren artean lotzeaz ere hitz egingo dugu.

Lehen bezala, pazientziarik gabe daudenek berehala egin dezakete joan eguneratutako biltegira eta dena ukitu zure eskuekin.


Edukia

  1. Zatitu
  2. Konkistatu

Zatitu

Gure helburu gorena lortzeko egin behar dugun lehenengo gauza garatzen dugun softwarea erabiltzailearen ikuspuntutik uniformeak diren bloke unibertsal eta isolatuetan banatzea da.

Lehen zatian, halako bloke estandar bat deskribatu zen - goiburuko liburutegia duen proiektua. Orain gehi diezaiogun liburutegi konpilatu bat gure proiektuari.

Horretarako, atera dezagun funtzioaren ezarpena myfunc bereizi batean .cpp- fitxategia:

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

Ondoren, konpilatu beharreko liburutegia definitzen dugu (myfeature), aurreko urratsean lortutakoarekin osatuko dena .cpp-fitxategia. Liburutegi berriak lehendik dauden goiburuak behar ditu, jakina, eta hori eskaintzeko, lehendik dagoen helburuari lotuta egon daiteke eta egon behar du. mylib. Gainera, haien arteko lotura publikoa da, hau da, helburuari lotuta egongo den guztia myfeature, karga eta helburua automatikoki jasoko ditu mylib (puntuzko metodoei buruz gehiago).

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

Ondoren, liburutegi berria sisteman instalatuta dagoela ziurtatuko dugu:

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

Kontuan izan behar da horretarako myfeature, gisa mylib aurrizkia duen ezizena sortu da Mylib::. Gauza bera idazten da bi helburuetarako sisteman instalatzeko esportatzerakoan. Horri esker, edozeinentzako helburuekin uniformeki lan egitea posible da loteslea eskema.

Horren ostean, unitate-probak liburutegi berriarekin (funtzioa myfunc izenburutik kenduta, beraz, orain estekatu behar duzu):

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
 )

Izenburuak (Mylib::mylib) orain ez duzu bereiz konektatu behar, lehen esan bezala, liburutegiarekin batera automatikoki konektatzen baitira (Mylib::myfeature).

Eta gehitu ditzagun Γ±abardura pare bat estaldura-neurketak ziurtatzeko, iritsi berria den liburutegia kontuan hartuta:

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

Liburutegiak, exekutagarriak eta abar gehiago gehi ditzakezu. Ez du axola nola zehazki elkarren artean konektatzen diren proiektuaren barruan. Garrantzitsuena da zein helburu diren gure moduluaren interfazea, hau da, kanpoan geratzen diren.

Konkistatu

Orain bloke-modulu estandarrak ditugu, eta menderatu ditzakegu: edozein konplexutasuneko egitura batean konposatu, sistema batean instalatu edo muntaketa-sistema bakar baten barruan lotuz.

Instalazioa sisteman

Modulua erabiltzeko aukeretako bat gure modulua sisteman instalatzea da.

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target install

Horren ondoren, beste edozein proiektura konektatzen da komandoa erabiliz find_package.

find_package(Mylib 1.0 REQUIRED)

Konexioa azpimodulu gisa

Beste aukera bat da gure proiektuarekin karpeta beste proiektu batera konektatzea azpimodulu gisa komandoa erabiliz add_subdirectory.

Erabili

Lotura-metodoak desberdinak dira, baina emaitza berdina da. Bi kasuetan, helburuak proiektuan eskuragarri egongo dira gure modulua erabiliz Mylib::myfeature ΠΈ Mylib::mylib, adibidez, honela erabil daiteke:

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

Zehazki, gure kasuan, liburutegia Mylib::myfeature konektatu behar da liburutegiarekin lotu behar denean libmyfeature. Goiburu nahikoa badago, merezi du liburutegia erabiltzea Mylib::mylib.

CMake helburuak delikatuak izan daitezke, adibidez, propietate, mendekotasun eta abar batzuk birbidaltzeko soilik helburu. Aldi berean, beraiekin lan egitea modu berean gertatzen da.

Hori da lortu behar genuena.

Iturria: www.habr.com

Gehitu iruzkin berria