C++ og CMake - bræður að eilífu, hluti II

C++ og CMake - bræður að eilífu, hluti II

Í fyrri hluta Þessi skemmtilega saga talaði um að skipuleggja hausbókasafn innan CMake smíðakerfisrafallsins.

Að þessu sinni munum við bæta við samansettu bókasafni við það og einnig tala um að tengja einingar við hvert annað.

Sem fyrr geta þeir sem eru óþolinmóðir strax farðu í uppfærða geymslu og snerta allt með eigin höndum.


efni

  1. Skiptu
  2. Sigra

Skiptu

Það fyrsta sem við þurfum að gera til að ná háleitu markmiði okkar er að skipta hugbúnaðinum sem við þróum í alhliða, einangraðar blokkir sem eru einsleitar frá sjónarhóli notandans.

Í fyrsta hluta var slíkri stöðluðu blokk lýst - verkefni með hausbókasafni. Nú skulum við bæta samsettu bókasafni við verkefnið okkar.

Til að gera þetta skulum við taka út framkvæmd aðgerðarinnar myfunc í sér .cpp-skrá:

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

Síðan skilgreinum við bókasafnið sem á að safna saman (myfeature), sem mun samanstanda af því sem fékkst í fyrra skrefi .cpp-skrá. Nýja bókasafnið krefst augljóslega fyrirliggjandi hausa og til að veita þetta getur og ætti það að vera bundið við núverandi tilgang mylib. Þar að auki eru tengslin á milli þeirra opinber, sem þýðir að allt sem skotmarkið verður tengt við myfeature, mun sjálfkrafa taka á móti álaginu og markmiðinu mylib (meira um prjónaaðferðir).

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

Næst munum við ganga úr skugga um að nýja bókasafnið sé einnig sett upp á kerfinu:

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

Það skal tekið fram að í þeim tilgangi myfeature, Eins og fyrir mylib samnefni með forskeyti var búið til Mylib::. Sama er skrifað í báðum tilgangi þegar þau eru flutt út til uppsetningar á kerfinu. Þetta gerir það mögulegt að vinna einsleitt með markmið fyrir hvaða bindandi kerfi.

Eftir þetta er allt sem eftir er að tengja einingapróf við nýja bókasafnið (function myfunc tekið út úr titlinum, svo nú þarftu að tengja):

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
 )

Fyrirsagnir (Mylib::mylib) Nú þarftu ekki að tengjast sérstaklega, því eins og áður hefur komið fram eru þeir sjálfkrafa tengdir ásamt bókasafninu (Mylib::myfeature).

Og við skulum bæta við nokkrum blæbrigðum til að tryggja þekjumælingar með hliðsjón af nýkomnu bókasafni:

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

Þú getur bætt við fleiri bókasöfnum, executables o.fl. Það skiptir ekki máli hversu nákvæmlega þau tengjast hver öðrum innan verkefnisins. Það eina sem skiptir máli er hvaða markmið eru viðmót einingarinnar okkar, það er að segja þau standa út.

Sigra

Nú erum við með staðlaðar blokkareiningar og við getum drottnað yfir þeim: sett þær saman í skipulag af hvaða flóknu sem er, sett þær upp í kerfi eða tengt þær saman í einu samsetningarkerfi.

Uppsetning inn í kerfið

Einn af möguleikunum til að nota eininguna er að setja eininguna okkar inn í kerfið.

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

Eftir það er það tengt við öll önnur verkefni með því að nota skipunina find_package.

find_package(Mylib 1.0 REQUIRED)

Tenging sem undireining

Annar valkostur er að tengja möppuna við verkefnið okkar við annað verkefni sem undireiningu með því að nota skipunina add_subdirectory.

Nota

Bindunaraðferðirnar eru mismunandi en niðurstaðan er sú sama. Í báðum tilvikum verða markmið tiltæk í verkefninu með því að nota eininguna okkar Mylib::myfeature и Mylib::mylib, sem hægt er að nota, til dæmis, svona:

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

Sérstaklega í okkar tilviki, bókasafnið Mylib::myfeature þarf að vera tengdur þegar nauðsynlegt er að tengja við bókasafnið libmyfeature. Ef það eru nógu margir hausar, þá er það þess virði að nota bókasafnið Mylib::mylib.

CMake markmið geta verið erfið, til dæmis, eingöngu ætluð til að senda nokkrar eignir, ósjálfstæði osfrv. Á sama tíma fer vinna með þau fram á sama hátt.

Það var það sem við þurftum að fá.

Heimild: www.habr.com

Bæta við athugasemd