C++ iyo CMake - walaalo weligood, qaybta II

C++ iyo CMake - walaalo weligood, qaybta II

Qaybtii hore Sheekadan madadaalada leh waxay ka hadlaysay abaabulka maktabad madax oo ku dhex jirta koronto dhaliyaha nidaamka dhismaha ee CMake.

Markan waxaan ku dari doonaa maktabad la isku duba riday, sidoo kale waxaan ka hadli doonaa isku xirka cutubyada midba midka kale.

Sidii hore oo kale, kuwa aan dulqaadan ayaa isla markaaba kara tag kaydka la cusboonaysiiyay oo wax walba ku taabo gacmahaaga.


Tusmo

  1. Qaybi
  2. Guuleysta

Qaybi

Waxa ugu horreeya ee aan u baahanahay in aan sameyno si aan u gaarno yoolkeena sare waa in aan u qaybinno software-ka aan horumarinayno oo aan u kala qaadno qaybo caalami ah, oo go'doonsan oo lebbisan marka loo eego aragtida isticmaale.

Qaybta hore, sida block caadiga ah ayaa lagu tilmaamay - mashruuc leh maktabad madax. Hadda aan ku darno maktabad la ururiyey mashruucayaga.

Si tan loo sameeyo, aan soo saarno hirgelinta shaqada myfunc si gaar ah .cpp-faylka:

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

Kadibna waxaan qeexeynaa maktabadda la ururinayo (myfeature), kaas oo ka koobnaan doona wixii lagu helay tallaabadii hore .cpp-faylka. Maktabadda cusub waxay si cad u baahan tahay madax-madaxeedyo jira, si tan loo bixiyona, way ku xidhan tahay ujeedada jirta. mylib. Waxaa intaa dheer, xiriirka ka dhexeeya iyaga waa mid guud, taas oo macnaheedu yahay in wax kasta oo bartilmaameedku uu ku xiran yahay myfeature, waxay si toos ah u heli doontaa culeyska iyo bartilmaameedka mylib (wax badan oo ku saabsan hababka tolida).

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

Marka xigta, waxaan hubin doonaa in maktabadda cusub sidoo kale lagu rakibay nidaamka:

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

Waa in la ogaadaa in ujeedada myfeature, sida mylib waxaa la sameeyay magacyo leh horgale Mylib::. Isla sidaas oo kale ayaa loo qoraa labada ujeedo marka loo dhoofinayo si loogu rakibo nidaamka. Tani waxay suurtogal ka dhigaysaa in si isku mid ah loogu shaqeeyo yoolal kasta nidaamka xidhitaanka.

Taas ka dib, waxa hadhay waa in lagu xidho imtixaanada cutubka iyo maktabadda cusub (shaqada myfunc laga saaray cinwaanka, markaa hadda waxaad u baahan tahay inaad ku xidho):

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
 )

Ciwaanada (Mylib::mylib) hadda uma baahnid inaad si gooni ah isku xirto, sababtoo ah, sidii hore loo sheegay, waxay si toos ah ugu xiran yihiin maktabadda (Mylib::myfeature).

Aynu ku darno dhowr siyaalood si aan u hubinno cabbirrada caymiska iyadoo la tixgalinayo maktabadda dhowaan timid:

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

Waxaad ku dari kartaa maktabado badan, kuwa la fulin karo, iwm. Macno ma laha sida saxda ah ee ay isugu xidhan yihiin mashruuca dhexdiisa. Waxa kaliya ee muhiimka ah waa bartilmaameedyada waa interface-ka modulekayaga, taas oo ah, way soo baxayaan.

Guuleysta

Hadda waxaan haynaa cutubyo blocks oo caadi ah, waxaanan ku xukumi karnaa iyaga: u samee qaab dhismeed kasta oo kakanaanta ah, ku rakibida nidaamka ama isku xirka hal nidaam oo isku dhafan.

Ku rakibida nidaamka

Mid ka mid ah xulashooyinka isticmaalka moduleka ayaa ah in lagu rakibo cutubkayaga nidaamka.

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

Taas ka dib, waxay ku xiran tahay mashruuc kasta oo kale iyadoo la adeegsanayo amarka find_package.

find_package(Mylib 1.0 REQUIRED)

Isku xirka sidii qaab-hoosaad

Ikhtiyaar kale ayaa ah in lagu xidho galka mashruucayaga iyo mashruuc kale sida submodule adoo isticmaalaya amarka add_subdirectory.

Isticmaal

Hababka xidhidu way kala duwan yihiin, laakiin natiijadu waa isku mid. Labada xaaladoodba, yoolalka ayaa laga heli doonaa mashruuca iyadoo la adeegsanayo cutubkayaga Mylib::myfeature ΠΈ Mylib::mylib, oo loo isticmaali karo, tusaale ahaan, sidan:

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

Gaar ahaan kiiskeena, maktabadda Mylib::myfeature u baahan in lagu xidho marka ay lama huraan tahay in lagu xidho maktabadda libmyfeature. Haddii ay jiraan madax ku filan, markaa waxaa habboon in la isticmaalo maktabadda Mylib::mylib.

Bartilmaameedyada CMake waxay noqon karaan kuwo khiyaano leh, tusaale ahaan, loogu talagalay kaliya in lagu gudbiyo guryaha qaar, ku tiirsanaanta, iwm. Isla mar ahaantaana, la shaqayntooda waxay u dhacdaa si isku mid ah.

Taasi waa waxa aan u baahanahay inaan helno.

Source: www.habr.com

Add a comment