C++ och CMake - bröder för alltid, del II

C++ och CMake - bröder för alltid, del II

I föregÄende del Den hÀr underhÄllande historien talade om att organisera ett rubrikbibliotek inom CMake build-systemgeneratorn.

Den hÀr gÄngen kommer vi att lÀgga till ett sammanstÀllt bibliotek till det, och Àven prata om att lÀnka moduler med varandra.

Som tidigare kan den som Àr otÄlig direkt gÄ till det uppdaterade arkivet och rör allt med dina egna hÀnder.


InnehÄll

  1. Dela upp
  2. Erövra

Dela upp

Det första vi behöver göra för att uppnÄ vÄrt höga mÄl Àr att dela upp mjukvaran vi utvecklar i universella, isolerade block som Àr enhetliga ur anvÀndarens synvinkel.

I den första delen beskrevs ett sÄdant standardblock - ett projekt med ett header-bibliotek. LÄt oss nu lÀgga till ett kompilerat bibliotek till vÄrt projekt.

För att göra detta, lÄt oss ta bort implementeringen av funktionen myfunc i en separat .cpp-fil:

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

Sedan definierar vi biblioteket som ska kompileras (myfeature), som kommer att bestÄ av det som erhölls i föregÄende steg .cpp-fil. Det nya biblioteket krÀver uppenbarligen befintliga rubriker, och för att tillhandahÄlla detta kan och bör det kopplas till det befintliga syftet mylib. Dessutom Àr kopplingen mellan dem offentlig, vilket innebÀr att allt som mÄlet kommer att kopplas till myfeature, kommer automatiskt att ta emot belastningen och mÄlet mylib (mer om stickmetoder).

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

DÀrefter ser vi till att det nya biblioteket ocksÄ Àr installerat pÄ systemet:

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

Det bör noteras att för ÀndamÄlet myfeature, som för mylib ett alias med ett prefix skapades Mylib::. Detsamma skrivs för bÄda ÀndamÄlen nÀr man exporterar dem för installation pÄ systemet. Detta gör det möjligt att arbeta enhetligt med mÄl för eventuella bindande schema.

Efter detta ÄterstÄr bara att koppla enhetstester med det nya biblioteket (funktion myfunc tagits ur titeln, sÄ nu mÄste du lÀnka):

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
 )

Rubriker (Mylib::mylib) nu behöver du inte ansluta separat, eftersom de, som redan nÀmnts, ansluts automatiskt tillsammans med biblioteket (Mylib::myfeature).

Och lÄt oss lÀgga till ett par nyanser för att sÀkerstÀlla tÀckningsmÀtningar med hÀnsyn till det nyinkomna biblioteket:

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

Du kan lÀgga till fler bibliotek, körbara filer etc. Det spelar ingen roll hur exakt de Àr kopplade till varandra inom projektet. Det enda viktiga Àr vilka mÄl som Àr grÀnssnittet i vÄr modul, det vill sÀga de sticker ut.

Erövra

Nu har vi standardblockmoduler, och vi kan dominera dem: komponera dem till en struktur av vilken komplexitet som helst, installera dem i ett system eller lÀnka ihop dem i ett enda monteringssystem.

Installation i systemet

Ett av alternativen för att anvÀnda modulen Àr att installera vÄr modul i systemet.

cmake --build путь/Đș/ŃĐ±ĐŸŃ€ĐŸŃ‡ĐœĐŸĐč/ЎОрДĐșŃ‚ĐŸŃ€ĐžĐž --target install

Efter det kopplas den till vilket annat projekt som helst med kommandot find_package.

find_package(Mylib 1.0 REQUIRED)

Anslutning som undermodul

Ett annat alternativ Àr att koppla mappen med vÄrt projekt till ett annat projekt som en undermodul med kommandot add_subdirectory.

AnvÀnd

Bindningsmetoderna Àr olika, men resultatet Àr detsamma. I bÄda fallen kommer mÄl att vara tillgÀngliga i projektet med hjÀlp av vÄr modul Mylib::myfeature О Mylib::mylib, som till exempel kan anvÀndas sÄ hÀr:

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

NÀrmare bestÀmt i vÄrt fall, biblioteket Mylib::myfeature mÄste anslutas nÀr det Àr nödvÀndigt att lÀnka till biblioteket libmyfeature. Om det finns tillrÀckligt med rubriker Àr det vÀrt att anvÀnda biblioteket Mylib::mylib.

CMake-mÄl kan vara knepiga, till exempel avsedda att endast vidarebefordra vissa egenskaper, beroenden, etc. Samtidigt sker arbetet med dem pÄ samma sÀtt.

Det var vad vi behövde fÄ.

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster