C++ û CMake - birayên herheyî, beşa II

C++ û CMake - birayên herheyî, beşa II

Di beşa berê de Vê çîroka dilşewat li ser organîzekirina pirtûkxaneyek sernavê di nav jeneratorê pergala avakirina CMake de axivî.

Vê carê em ê pirtûkxaneyek berhevkirî lê zêde bikin, û di heman demê de behsa girêdana modulan bi hev re bikin.

Wekî berê, yên ku bêsebir in, dikarin tavilê biçin depoya nûvekirî û bi destên xwe her tiştî bi dest bixin.


Contains

  1. Parkirin
  2. Dagirtin

Parkirin

Yekem tiştê ku divê em bikin ji bo ku em bigihîjin armanca xweya bilind ev e ku nermalava ku em pêşdixin li blokên gerdûnî, veqetandî yên ku ji nêrîna bikarhêner yekreng in dabeş bikin.

Di beşa yekem de, blokek wusa standard hate vegotin - projeyek bi pirtûkxaneyek sernavê. Naha em pirtûkxaneyek berhevkirî li projeya xwe zêde bikin.

Ji bo vê yekê, bila em pêkanîna fonksiyonê derxînin myfunc li cihê cuda .cpp-dosî:

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

Dûv re em pirtûkxaneya ku were berhev kirin diyar dikin (myfeature), ku dê ji tiştê ku di gava berê de hatî bidestxistin pêk tê .cpp-dosî. Pirtûkxaneya nû eşkere sernivîsên heyî hewce dike, û ji bo peydakirina vê, ew dikare û divê bi armanca heyî ve were girêdan. mylib. Wekî din, girêdana di navbera wan de gelemperî ye, ku tê vê wateyê ku her tiştê ku armanc dê pê ve girêdayî be myfeature, dê bixweber bar û armancê bistînin mylib (bêtir li ser rêbazên 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)
+

Piştre, em ê piştrast bikin ku pirtûkxaneya nû jî li ser pergalê hatî saz kirin:

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

Divê bê zanîn ku ji bo armanca myfeature, ji bo mylib navekî bi pêşgir hate afirandin Mylib::. Heman tişt ji bo her du armancan têne nivîsandin dema ku wan ji bo sazkirinê li ser pergalê têne şandin. Ev dihêle ku ji bo her yekê bi yekdengî bi armancan re bixebitin plana girêdanê.

Piştî vê yekê, ya ku dimîne ev e ku hûn ceribandinên yekîneyê bi pirtûkxaneya nû ve girêdin (fonk myfunc ji sernavê hatî derxistin, ji ber vê yekê naha hûn hewce ne ku girêdin):

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
 )

Sernav (Mylib::mylib) naha hûn ne hewce ne ku ji hev veqetînin, ji ber ku, wekî ku berê hatî behs kirin, ew bixweber bi pirtûkxaneyê ve têne girêdan (Mylib::myfeature).

We ka em çend nuwazeyan lê zêde bikin da ku pîvandinên vegirtinê bi hesabkirina pirtûkxaneya nûhatî piştrast bikin:

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

Hûn dikarin bêtir pirtûkxane, kargêr, hwd zêde bikin. Ne girîng e ku ew di nav projeyê de çiqas bi hevûdu ve girêdayî ne. Tişta tenê girîng ev e ku kîjan armanc pêwendiya modula me ne, ango ew li ber xwe didin.

Dagirtin

Naha me modulên blokê yên standard hene, û em dikarin wan serdest bikin: wan di nav avahiyek her tevlihevî de berhev bikin, wan li pergalek saz bikin an wan di nav pergalek meclîsê de bi hev re girêdin.

Sazkirina nav sîstemê

Yek ji vebijarkên ji bo karanîna modulê sazkirina modula me di pergalê de ye.

cmake --build путь/к/сборочной/директории --target install

Piştî wê, ew bi karanîna fermanê bi projeyek din ve girêdayî ye find_package.

find_package(Mylib 1.0 REQUIRED)

Têkilî wekî submodule

Vebijarkek din ev e ku em peldankê bi projeya xwe ve bi projeyek din ve wekî submodulek bi karanîna fermanê ve girêbidin add_subdirectory.

Bikar bînin

Rêbazên girêdanê cuda ne, lê encam yek e. Di her du rewşan de, armanc dê di projeyê de bi karanîna modula me peyda bibin Mylib::myfeature и Mylib::mylib, ku dikare were bikar anîn, bo nimûne, wekî vê:

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

Bi taybetî di doza me de, pirtûkxane Mylib::myfeature Dema ku pêdivî ye ku bi pirtûkxaneyê re were girêdan pêdivî ye ku were girêdan libmyfeature. Ger sernivîsên têr hebin, wê hingê hêja ye ku pirtûkxaneyê bikar bînin Mylib::mylib.

Armancên CMake dikarin xapînok bin, mînakî, ku tenê ji bo şandina hin taybetmendî, girêdan, hwd têne armanc kirin. Di heman demê de, xebata bi wan re bi heman rengî pêk tê.

Ya ku me hewce dikir ev e.

Source: www.habr.com

Add a comment