C ++ kunye CMake - abazalwana ngonaphakade, inxalenye II

C ++ kunye CMake - abazalwana ngonaphakade, inxalenye II

Kwinxalenye engaphambili Eli bali eyonwabisayo wathetha ngokuququzelela ilayibrari header ngaphakathi CMake ukwakha inkqubo generator.

Ngeli xesha siya kongeza ithala leencwadi elihlanganisiweyo kuyo, kwaye sithethe malunga nokudibanisa iimodyuli enye kwenye.

Njengangaphambili, abo bangenamonde banako ngoko nangoko yiya kwindawo yokugcina ehlaziyiweyo kwaye ubambe yonke into ngezandla zakho.


Iziqulatho

  1. Yahlula
  2. Yoyisa

Yahlula

Into yokuqala ekufuneka siyenzile ukufezekisa injongo yethu ephezulu kukwahlulahlula isoftware esiyiphuhlisayo ibe ziibhloko ezizimeleyo, ezizimeleyo ezifanayo ngokwembono yomsebenzisi.

Kwinxalenye yokuqala, ibhloko enjalo eqhelekileyo yachazwa - iprojekthi enelayibrari yentloko. Ngoku masenze ithala leencwadi elihlanganisiweyo kwiprojekthi yethu.

Ukwenza oku, makhe sithathe ukuphunyezwa komsebenzi myfunc ngokwahlukileyo .cpp-ifayile:

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

Emva koko sichaza ithala leencwadi eliza kuqulunqwa (myfeature), eya kubandakanya into efunyenwe kwisinyathelo sangaphambili .cpp-ifayile. Ithala leencwadi elitsha ngokucacileyo lifuna iiheader ezikhoyo, kwaye ukuze kubonelelwe ngoku, linokuthi kwaye libotshelelwe kwinjongo ekhoyo. mylib. Ngaphezu koko, uxhulumaniso phakathi kwabo luluntu, oku kuthetha ukuba yonke into ekujoliswe kuyo iya kudibaniswa myfeature, iya kufumana ngokuzenzekelayo umthwalo kunye nethagethi mylib (ngakumbi malunga neendlela zokunitha).

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

Okulandelayo, siya kuqinisekisa ukuba ithala leencwadi elitsha lifakwe kwisistim:

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

Kufuneka kuqatshelwe ukuba injongo myfeature, ngoko mylib isibizo esinesimaphambili senziwe Mylib::. Okufanayo kubhalwe kuzo zombini iinjongo xa uthumela ngaphandle ukuze ufakelwe kwisixokelelwano. Oku kwenza kube lula ukusebenza ngokufanayo kunye neenjongo kuyo nayiphi na inkqubo yokubophelela.

Emva koku, okuseleyo kukudibanisa iimvavanyo zeyunithi nethala leencwadi elitsha (umsebenzi myfunc ikhutshwe kwisihloko, ke ngoku kufuneka udibanise):

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
 )

Izihloko (Mylib::mylib) ngoku awudingi kudibanisa ngokwahlukeneyo, kuba, njengoko sele kukhankanyiwe, ziqhagamshelwe ngokuzenzekelayo kunye nethala leencwadi (Mylib::myfeature).

Kwaye songeze iinuances ezimbalwa zokuqinisekisa imilinganiselo yokhuselo ethathela ingqalelo ithala leencwadi elitsha elifikileyo:

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

Unokongeza iilayibrari ezininzi, eziphunyeziweyo, njl. Akukhathaliseki ukuba ziqhagamshelwe kangakanani na phakathi kweprojekthi. Eyona nto ibalulekileyo kukuba zeziphi iithagethi lujongano lwemodyuli yethu, oko kukuthi, zincamathele.

Yoyisa

Ngoku sineemodyuli zebhloko eziqhelekileyo, kwaye sinokuzilawula: zidibanise kwisakhiwo sayo nayiphi na into enzima, ukuyifaka kwisistim okanye ukudibanisa kunye ngaphakathi kwenkqubo yendibano enye.

Ufakelo kwisixokelelwano

Enye yeenketho zokusebenzisa imodyuli kukufaka imodyuli yethu kwisistim.

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

Emva koko, idityaniswe kuyo nayiphi na enye iprojekthi isebenzisa umyalelo find_package.

find_package(Mylib 1.0 REQUIRED)

Uqhagamshelwano njengemodyuli engaphantsi

Enye inketho kukudibanisa ifolda kunye neprojekthi yethu kwenye iprojekthi njengemodyuli engaphantsi usebenzisa umyalelo add_subdirectory.

Sebenzisa

Iindlela zokubopha zahlukile, kodwa umphumo uyafana. Kuzo zombini ezi meko, iinjongo ziya kufumaneka kwiprojekthi kusetyenziswa imodyuli yethu Mylib::myfeature ΠΈ Mylib::mylib, enokusetyenziswa, umzekelo, ngolu hlobo:

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

Ngokukodwa kwimeko yethu, ithala leencwadi Mylib::myfeature kufuneka idityaniswe xa kukho imfuneko yokudibanisa nethala leencwadi libmyfeature. Ukuba kukho izihloko ezaneleyo, ngoko kuyafaneleka ukusebenzisa ithala leencwadi Mylib::mylib.

Iithagethi zeCMake zinokukhohlisa, umzekelo, zijolise kuphela ukuhambisa ezinye iipropathi, ukuxhomekeka, njl. Kwangaxeshanye, ukusebenza nabo kwenzeka ngendlela efanayo.

Nantso into ebesiyidinga.

umthombo: www.habr.com

Yongeza izimvo