C++ na CMake - ndugu milele, sehemu ya II

C++ na CMake - ndugu milele, sehemu ya II

Katika sehemu iliyopita Hadithi hii ya kuburudisha ilizungumza kuhusu kupanga maktaba ya kichwa ndani ya jenereta ya mfumo wa kujenga wa CMake.

Wakati huu tutaongeza maktaba iliyokusanywa kwake, na pia tutazungumza juu ya kuunganisha moduli na kila mmoja.

Kama hapo awali, wale ambao hawana subira wanaweza mara moja nenda kwenye hifadhi iliyosasishwa na kugusa kila kitu kwa mikono yako mwenyewe.


yaliyomo

  1. Gawanya
  2. Kushinda

Gawanya

Jambo la kwanza tunalohitaji kufanya ili kufikia lengo letu kuu ni kugawanya programu tunayotengeneza katika vizuizi vya ulimwengu wote, vilivyotengwa ambavyo vinafanana kutoka kwa maoni ya mtumiaji.

Katika sehemu ya kwanza, kizuizi cha kawaida kama hicho kilielezewa - mradi ulio na maktaba ya kichwa. Sasa hebu tuongeze maktaba iliyokusanywa kwenye mradi wetu.

Ili kufanya hivyo, hebu tuchukue utekelezaji wa kazi myfunc katika tofauti .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

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

Kisha tunafafanua maktaba ya kukusanywa (myfeature), ambayo itajumuisha kile kilichopatikana katika hatua ya awali .cpp-faili. Maktaba mpya ni wazi inahitaji vichwa vilivyopo, na ili kutoa hii, inaweza na inapaswa kushikamana na madhumuni yaliyopo. mylib. Aidha, uhusiano kati yao ni wa umma, ambayo ina maana kwamba kila kitu ambacho lengo litaunganishwa myfeature, itapokea mzigo na lengo moja kwa moja mylib (zaidi kuhusu mbinu za kuunganisha).

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

Ifuatayo, tutahakikisha kuwa maktaba mpya pia imewekwa kwenye mfumo:

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

Ikumbukwe kwamba kwa madhumuni myfeature, kama kwa mylib lakabu yenye kiambishi awali iliundwa Mylib::. Vile vile vimeandikwa kwa madhumuni yote mawili wakati wa kuwasafirisha kwa ajili ya ufungaji kwenye mfumo. Hii inafanya uwezekano wa kufanya kazi kwa usawa na malengo kwa yoyote mpango wa kufunga.

Baada ya hayo, kilichobaki ni kuunganisha majaribio ya kitengo na maktaba mpya (function myfunc imetolewa nje ya kichwa, kwa hivyo sasa unahitaji kuunganisha):

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
 )

Vichwa (Mylib::mylib) sasa hauitaji kuunganishwa kando, kwa sababu, kama ilivyotajwa tayari, zimeunganishwa kiotomatiki pamoja na maktaba (Mylib::myfeature).

Na wacha tuongeze nuances kadhaa ili kuhakikisha vipimo vya chanjo kwa kuzingatia maktaba mpya iliyofika:

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

Unaweza kuongeza maktaba zaidi, zinazoweza kutekelezwa, n.k. Haijalishi ni jinsi gani wameunganishwa kwa kila mmoja ndani ya mradi. Jambo muhimu pekee ni malengo gani ni kiolesura cha moduli yetu, yaani, yanashikamana.

Kushinda

Sasa tuna moduli za kawaida za kuzuia, na tunaweza kuzitawala: kuzitunga katika muundo wa utata wowote, kuziweka kwenye mfumo au kuziunganisha pamoja ndani ya mfumo mmoja wa mkusanyiko.

Ufungaji kwenye mfumo

Moja ya chaguzi za kutumia moduli ni kusakinisha moduli yetu kwenye mfumo.

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

Baada ya hapo, imeunganishwa na mradi mwingine wowote kwa kutumia amri find_package.

find_package(Mylib 1.0 REQUIRED)

Muunganisho kama moduli ndogo

Chaguo jingine ni kuunganisha folda na mradi wetu kwa mradi mwingine kama moduli ndogo kwa kutumia amri add_subdirectory.

Matumizi ya

Njia za kufunga ni tofauti, lakini matokeo ni sawa. Katika visa vyote viwili, malengo yatapatikana katika mradi kwa kutumia moduli yetu Mylib::myfeature ΠΈ Mylib::mylib, ambayo inaweza kutumika, kwa mfano, kama hii:

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

Hasa katika kesi yetu, maktaba Mylib::myfeature haja ya kuunganishwa wakati ni muhimu kuunganishwa na maktaba libmyfeature. Ikiwa kuna vichwa vya kutosha, basi inafaa kutumia maktaba Mylib::mylib.

Malengo ya CMake yanaweza kuwa gumu, kwa mfano, yaliyokusudiwa tu kusambaza mali fulani, tegemezi, n.k. Wakati huo huo, kufanya kazi nao hutokea kwa njia ile ile.

Hiyo ndiyo tuliyohitaji kupata.

Chanzo: mapenzi.com

Kuongeza maoni