C++ ak CMake - frè pou tout tan, pati II

C++ ak CMake - frè pou tout tan, pati II

Nan pati anvan an Istwa amizan sa a te pale sou òganize yon bibliyotèk header nan dèlko sistèm CMake bati.

Fwa sa a, nou pral ajoute yon bibliyotèk konpile nan li, epi tou pale sou lyen modil youn ak lòt.

Menm jan anvan, moun ki enpasyan kapab imedyatman ale nan repozitwa a ajou epi manyen tout bagay ak pwòp men ou.


Content

  1. Divize
  2. Konkeri

Divize

Premye bagay nou bezwen fè pou reyalize objektif elve nou an se divize lojisyèl nou devlope an inivèsèl, blòk izole ki inifòm nan pwen de vi itilizatè a.

Nan premye pati a, yo te dekri tankou yon blòk estanda - yon pwojè ak yon bibliyotèk header. Koulye a, ann ajoute yon bibliyotèk konpile nan pwojè nou an.

Pou fè sa, se pou yo retire aplikasyon an nan fonksyon an myfunc nan yon separe .cpp-dosye:

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

Lè sa a, nou defini bibliyotèk la dwe konpile (myfeature), ki pral konpoze de sa ki te jwenn nan etap anvan an .cpp-dosye. Nouvo bibliyotèk la evidamman mande pou tèt ki egziste deja, epi yo nan lòd yo bay sa a, li ka e li ta dwe mare nan objektif ki egziste deja. mylib. Anplis, koneksyon ki genyen ant yo se piblik, ki vle di ke tout bagay ki pral sib la dwe konekte myfeature, pral otomatikman resevwa chaj la ak sib mylib (plis sou metòd trikote).

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

Apre sa, nou pral asire w ke nouvo bibliyotèk la enstale tou sou sistèm nan:

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

Li ta dwe remake ke nan objektif la myfeature, tankou mylib yo te kreye yon alyas ak yon prefiks Mylib::. Menm bagay la tou ekri pou tou de rezon lè yo ekspòte yo pou enstalasyon sou sistèm lan. Sa fè li posib pou travay menm jan ak objektif pou nenpòt ki konplo obligatwa.

Apre sa, tout sa ki rete se konekte tès inite yo ak nouvo bibliyotèk la (fonksyon myfunc retire nan tit la, kidonk kounye a ou bezwen konekte):

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
 )

Tit (Mylib::mylib) kounye a ou pa bezwen konekte separeman, paske, kòm deja mansyone, yo otomatikman konekte ansanm ak bibliyotèk la (Mylib::myfeature).

Epi ann ajoute yon koup de nuans pou asire mezi kouvèti asirans yo pran an kont bibliyotèk ki fèk rive:

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

Ou ka ajoute plis bibliyotèk, ègzèkutabl, elatriye. Li pa enpòtan ki jan egzakteman yo konekte youn ak lòt nan pwojè a. Bagay la sèlman enpòtan se ki objektif yo se koòdone nan modil nou an, se sa ki, yo bwa deyò.

Konkeri

Koulye a, nou gen modil blòk estanda, epi nou ka domine yo: konpoze yo nan yon estrikti nan nenpòt ki konpleksite, enstale yo nan yon sistèm oswa konekte yo ansanm nan yon sèl sistèm asanble.

Enstalasyon nan sistèm lan

Youn nan opsyon pou itilize modil la se enstale modil nou an nan sistèm nan.

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

Apre sa, li konekte ak nenpòt lòt pwojè lè l sèvi avèk lòd la find_package.

find_package(Mylib 1.0 REQUIRED)

Koneksyon kòm yon soumodil

Yon lòt opsyon se konekte katab la ak pwojè nou an nan yon lòt pwojè kòm yon submodule lè l sèvi avèk lòd la add_subdirectory.

Sèvi ak

Metòd obligatwa yo diferan, men rezilta a se menm. Nan de ka yo, objektif yo ap disponib nan pwojè a lè l sèvi avèk modil nou an Mylib::myfeature и Mylib::mylib, ki ka itilize, pou egzanp, tankou sa a:

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

Espesyalman nan ka nou an, bibliyotèk la Mylib::myfeature bezwen konekte lè li nesesè pou konekte ak bibliyotèk la libmyfeature. Si gen ase headers, Lè sa a, li vo itilize bibliyotèk la Mylib::mylib.

Objektif CMake yo ka difisil, pou egzanp, gen entansyon sèlman pou voye kèk pwopriyete, depandans, elatriye. An menm tan an, travay ak yo rive nan menm fason an.

Se sa nou te bezwen jwenn.

Sous: www.habr.com

Add nouvo kòmantè