C++ ug CMake - mga igsoon sa kahangturan, bahin II

C++ ug CMake - mga igsoon sa kahangturan, bahin II

Sa miaging bahin Kini nga makalingaw nga istorya naghisgot bahin sa pag-organisar sa usa ka header library sa sulod sa CMake build system generator.

Niining higayona magdugang kami usa ka giipon nga librarya niini, ug maghisgot usab bahin sa pag-link sa mga module sa usag usa.

Sama kaniadto, ang mga walay pasensya mahimo dayon adto sa updated repository ug hikapa ang tanan sa imong kaugalingong mga kamot.


Mga sulod

  1. Bahina
  2. Pagdaug

Bahina

Ang unang butang nga kinahanglan natong buhaton aron makab-ot ang atong taas nga tumong mao ang pagbahin sa software nga atong gihimo ngadto sa unibersal, hilit nga mga bloke nga managsama gikan sa panglantaw sa user.

Sa una nga bahin, ang ingon nga usa ka sumbanan nga bloke gihulagway - usa ka proyekto nga adunay usa ka librarya sa ulohan. Karon atong idugang ang usa ka hinipos nga librarya sa atong proyekto.

Aron mahimo kini, atong kuhaon ang pagpatuman sa function myfunc sa usa ka bulag .cpp-file:

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

Dayon among gihubit ang librarya nga i-compile (myfeature), nga maglangkob sa nakuha sa miaging lakang .cpp- file. Ang bag-ong librarya klaro nga nanginahanglan sa mga naa na nga mga ulohan, ug aron mahatagan kini, mahimo kini ug kinahanglan nga ihigot sa naglungtad nga katuyoan. mylib. Dugang pa, ang koneksyon tali kanila mao ang publiko, nga nagpasabut nga ang tanan diin ang target makonektar myfeature, awtomatik nga makadawat sa load ug target mylib (dugang pa bahin sa mga pamaagi sa pag-knitting).

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

Sunod, among sigurohon nga ang bag-ong librarya na-install usab sa sistema:

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

Kini kinahanglan nga matikdan nga alang sa katuyoan myfeature, ingon sa mylib usa ka alyas nga adunay prefix ang gihimo Mylib::. Ang parehas nga gisulat alang sa parehas nga katuyoan kung gi-eksport kini alang sa pag-install sa sistema. Kini nagpaposible sa pagtrabaho nga parehas sa mga tumong alang sa bisan unsa pagbugkos nga laraw.

Pagkahuman niini, ang nahabilin mao ang pag-link sa mga pagsulay sa yunit sa bag-ong librarya (function myfunc gikuha gikan sa titulo, busa karon kinahanglan nimo nga i-link):

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
 )

Mga ulohan (Mylib::mylib) karon dili nimo kinahanglan nga magkonektar nga gilain, tungod kay, sama sa nahisgutan na, awtomatiko sila nga konektado kauban ang librarya (Mylib::myfeature).

Ug magdugang kita og pipila ka mga nuances aron maseguro ang mga pagsukod sa coverage nga gikonsiderar ang bag-ong miabut nga librarya:

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

Mahimo nimong idugang ang daghang mga librarya, mga executable, ug uban pa. Dili igsapayan kung giunsa sila konektado sa usag usa sulod sa proyekto. Ang importante lang mao nga ang mga target mao ang interface sa atong module, nga mao, sila nagpabilin.

Pagdaug

Karon aduna na kitay mga standard block modules, ug mahimo natong dominahan sila: i-compose kini ngadto sa usa ka istruktura sa bisan unsa nga pagkakomplikado, pag-instalar niini ngadto sa usa ka sistema o pagsumpay niini sulod sa usa ka sistema sa asembliya.

Pag-instalar sa sistema

Usa sa mga kapilian sa paggamit sa module mao ang pag-instalar sa atong module sa sistema.

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

Pagkahuman niana, konektado kini sa bisan unsang ubang proyekto gamit ang mando find_package.

find_package(Mylib 1.0 REQUIRED)

Koneksyon isip usa ka submodule

Ang laing kapilian mao ang pagkonektar sa folder sa among proyekto ngadto sa laing proyekto isip submodule gamit ang command add_subdirectory.

Paggamit

Ang mga paagi sa pagbugkos lahi, apan ang resulta parehas. Sa duha ka kaso, ang mga tumong mahimong magamit sa proyekto gamit ang atong module Mylib::myfeature ΠΈ Mylib::mylib, nga mahimong gamiton, pananglitan, sama niini:

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

Partikular sa among kaso, ang librarya Mylib::myfeature kinahanglan nga konektado kung kinahanglan nga mag-link sa librarya libmyfeature. Kung adunay igo nga mga ulohan, nan kini angay nga gamiton ang librarya Mylib::mylib.

Ang mga target sa CMake mahimong malisud, pananglitan, gituyo lamang sa pagpasa sa pipila ka mga kabtangan, dependency, ug uban pa. Sa samang higayon, ang pagtrabaho uban kanila mahitabo sa samang paagi.

Mao kana ang kinahanglan namon nga makuha.

Source: www.habr.com

Idugang sa usa ka comment