C++ og CMake - brĂždre for alltid, del II

C++ og CMake - brĂždre for alltid, del II

I forrige del Denne underholdende historien snakket om Ă„ organisere et header-bibliotek i CMake build-systemgeneratoren.

Denne gangen vil vi legge til et kompilert bibliotek til det, og ogsÄ snakke om Ä koble moduler med hverandre.

Som fÞr kan de som er utÄlmodige umiddelbart gÄ til det oppdaterte depotet og ta pÄ alt med egne hender.


Innhold

  1. Dele opp
  2. Erobre

Dele opp

Det fÞrste vi mÄ gjÞre for Ä nÄ vÄrt hÞye mÄl er Ä dele opp programvaren vi utvikler i universelle, isolerte blokker som er enhetlige fra brukerens synspunkt.

I den fÞrste delen ble en slik standardblokk beskrevet - et prosjekt med et overskriftsbibliotek. La oss nÄ legge til et kompilert bibliotek til prosjektet vÄrt.

For Ă„ gjĂžre dette, la oss ta ut implementeringen av funksjonen 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;
+    }
+}

Deretter definerer vi biblioteket som skal kompileres (myfeature), som vil bestÄ av det som ble oppnÄdd i forrige trinn .cpp-fil. Det nye biblioteket krever Äpenbart eksisterende overskrifter, og for Ä kunne tilby dette kan og bÞr det knyttes til det eksisterende formÄlet mylib. Dessuten er forbindelsen mellom dem offentlig, noe som betyr at alt som mÄlet vil vÊre koblet til myfeature, vil automatisk motta lasten og mÄlet mylib (mer om strikkemetoder).

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

Deretter skal vi sÞrge for at det nye biblioteket ogsÄ er installert 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 skal bemerkes at for formÄlet myfeature, nÄr det gjelder mylib et alias med et prefiks ble opprettet Mylib::. Det samme skrives for begge formÄl nÄr de eksporteres for installasjon pÄ systemet. Dette gjÞr det mulig Ä jobbe enhetlig med mÄl for evt bindende ordning.

Etter dette gjenstÄr det bare Ä koble enhetstester med det nye biblioteket (funksjon myfunc tatt ut av tittelen, sÄ nÄ mÄ du linke):

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
 )

Overskrifter (Mylib::mylib) nÄ trenger du ikke koble til separat, fordi, som allerede nevnt, kobles de automatisk sammen med biblioteket (Mylib::myfeature).

Og la oss legge til et par nyanser for Ä sikre dekningsmÄlinger som tar hensyn til det nylig ankomne 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 legge til flere biblioteker, kjÞrbare filer osv. Det spiller ingen rolle hvor nÞyaktig de er knyttet til hverandre innenfor prosjektet. Det eneste viktige er hvilke mÄl som er grensesnittet til modulen vÄr, det vil si at de stikker seg ut.

Erobre

NĂ„ har vi standard blokkmoduler, og vi kan dominere dem: komponere dem til en struktur av enhver kompleksitet, installere dem i et system eller koble dem sammen i et enkelt monteringssystem.

Installasjon i systemet

Et av alternativene for Ä bruke modulen er Ä installere vÄr modul i systemet.

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

Etter det kobles den til et hvilket som helst annet prosjekt ved Ă„ bruke kommandoen find_package.

find_package(Mylib 1.0 REQUIRED)

Tilkobling som en undermodul

Et annet alternativ er Ä koble mappen med prosjektet vÄrt til et annet prosjekt som en undermodul ved Ä bruke kommandoen add_subdirectory.

Bruk

Bindingsmetodene er forskjellige, men resultatet er det samme. I begge tilfeller vil mÄl vÊre tilgjengelige i prosjektet ved hjelp av vÄr modul Mylib::myfeature О Mylib::mylib, som kan brukes for eksempel slik:

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

Spesielt i vÄrt tilfelle, biblioteket Mylib::myfeature mÄ kobles til nÄr det er nÞdvendig Ä koble til biblioteket libmyfeature. Hvis det er nok overskrifter, er det verdt Ä bruke biblioteket Mylib::mylib.

CMake-mÄl kan vÊre vanskelige, for eksempel kun ment Ä videresende enkelte egenskaper, avhengigheter osv. Samtidig skjer arbeidet med dem pÄ samme mÄte.

Det var det vi trengte Ä fÄ.

Kilde: www.habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig webhotell med DDoS-beskyttelse, VPS VDS-servere | ProHoster