C++ a CMake - brodyr am byth, rhan II

C++ a CMake - brodyr am byth, rhan II

Yn y rhan flaenorol Roedd y stori ddifyr hon yn sôn am drefnu llyfrgell pennawd o fewn generadur system adeiladu CMake.

Y tro hwn byddwn yn ychwanegu llyfrgell gryno ato, a hefyd yn siarad am gysylltu modiwlau â'i gilydd.

Fel o'r blaen, gall y rhai sy'n ddiamynedd ar unwaith ewch i'r ystorfa wedi'i diweddaru a chyffyrddwch bopeth â'ch dwylo eich hun.


Cynnwys

  1. Rhannwch
  2. Gorchfygu

Rhannwch

Y peth cyntaf y mae angen inni ei wneud i gyflawni ein nod uchel yw rhannu'r feddalwedd a ddatblygwn yn flociau cyffredinol, ynysig sy'n unffurf o safbwynt y defnyddiwr.

Yn y rhan gyntaf, disgrifiwyd bloc safonol o'r fath - prosiect gyda llyfrgell pennawd. Nawr, gadewch i ni ychwanegu llyfrgell gryno at ein prosiect.

I wneud hyn, gadewch i ni ddileu gweithrediad y swyddogaeth myfunc mewn ar wahân .cpp-ffeil:

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

Yna rydyn ni'n diffinio'r llyfrgell i'w llunio (myfeature), a fydd yn cynnwys yr hyn a gafwyd yn y cam blaenorol .cpp-ffeil. Mae’n amlwg bod angen penawdau presennol ar y llyfrgell newydd, ac er mwyn darparu hyn, gellir a dylid ei glymu i’r pwrpas presennol. mylib. Ar ben hynny, mae'r cysylltiad rhyngddynt yn gyhoeddus, sy'n golygu y bydd popeth y bydd y targed yn gysylltiedig ag ef myfeature, yn derbyn y llwyth a'r targed yn awtomatig mylib (mwy am ddulliau gwau).

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

Nesaf, byddwn yn sicrhau bod y llyfrgell newydd hefyd yn cael ei gosod ar y system:

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

Dylid nodi hynny i'r pwrpas myfeature, fel ar gyfer mylib crewyd alias gyda rhagddodiad Mylib::. Mae'r un peth wedi'i ysgrifennu at y ddau ddiben wrth eu hallforio i'w gosod ar y system. Mae hyn yn ei gwneud hi'n bosibl gweithio'n unffurf gyda nodau ar gyfer unrhyw un cynllun rhwymo.

Ar ôl hyn, y cyfan sydd ar ôl yw cysylltu profion uned â'r llyfrgell newydd (swyddogaeth myfunc wedi'i dynnu allan o'r teitl, felly nawr mae angen i chi gysylltu):

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
 )

Penawdau (Mylib::mylib) nawr nid oes angen i chi gysylltu ar wahân, oherwydd, fel y crybwyllwyd eisoes, maent wedi'u cysylltu'n awtomatig ynghyd â'r llyfrgell (Mylib::myfeature).

A gadewch i ni ychwanegu ychydig o naws i sicrhau mesuriadau cwmpas gan ystyried y llyfrgell sydd newydd gyrraedd:

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

Gallwch ychwanegu mwy o lyfrgelloedd, pethau gweithredadwy, ac ati. Nid oes gwahaniaeth sut yn union y maent yn gysylltiedig â'i gilydd o fewn y prosiect. Yr unig beth pwysig yw pa dargedau yw rhyngwyneb ein modiwl, hynny yw, maen nhw'n glynu.

Gorchfygu

Nawr mae gennym ni fodiwlau bloc safonol, a gallwn eu dominyddu: eu cyfansoddi i strwythur o unrhyw gymhlethdod, eu gosod mewn system neu eu cysylltu â'i gilydd o fewn un system gydosod.

Gosod yn y system

Un o'r opsiynau ar gyfer defnyddio'r modiwl yw gosod ein modiwl yn y system.

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

Ar ôl hynny, mae'n gysylltiedig ag unrhyw brosiect arall gan ddefnyddio'r gorchymyn find_package.

find_package(Mylib 1.0 REQUIRED)

Cysylltiad fel is-fodiwl

Opsiwn arall yw cysylltu'r ffolder â'n prosiect i brosiect arall fel is-fodiwl gan ddefnyddio'r gorchymyn add_subdirectory.

Defnyddio

Mae'r dulliau rhwymo yn wahanol, ond mae'r canlyniad yr un peth. Yn y ddau achos, bydd nodau ar gael yn y prosiect gan ddefnyddio ein modiwl Mylib::myfeature и Mylib::mylib, y gellir ei ddefnyddio, er enghraifft, fel hyn:

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

Yn benodol yn ein hachos ni, y llyfrgell Mylib::myfeature angen cysylltu pan fo angen cysylltu â'r llyfrgell libmyfeature. Os oes digon o benawdau, yna mae'n werth defnyddio'r llyfrgell Mylib::mylib.

Gall targedau CMake fod yn anodd, er enghraifft, wedi'u bwriadu i anfon rhai eiddo, dibyniaethau, ac ati yn unig ymlaen. Ar yr un pryd, mae gweithio gyda nhw yn digwydd yn yr un modd.

Dyna beth oedd angen i ni ei gael.

Ffynhonnell: hab.com

Ychwanegu sylw