C ++ en CMake - bruorren foar altyd, diel II

C ++ en CMake - bruorren foar altyd, diel II

Yn it foarige diel Dit ferdivedearjende ferhaal praat oer it organisearjen fan in koptekstbibleteek binnen de CMake build-systeemgenerator.

Dizze kear sille wy der in gearstalde bibleteek oan tafoegje, en ek prate oer it keppeljen fan modules mei elkoar.

Lykas earder kin dejingen dy't ûngeduldich binne fuortendaliks gean nei it bywurke repository en oanreitsje alles mei jo eigen hannen.


Ynhâld

  1. Ferdiele
  2. Feroverje

Ferdiele

It earste ding dat wy moatte dwaan om ús hege doel te berikken is om de software dy't wy ûntwikkelje te ferdielen yn universele, isolearre blokken dy't unifoarm binne út it eachpunt fan 'e brûker.

Yn it earste diel waard sa'n standertblok beskreaun - in projekt mei in koptekstbibleteek. Litte wy no in gearstalde bibleteek tafoegje oan ús projekt.

Om dit te dwaan, litte wy de útfiering fan 'e funksje útnimme myfunc yn in apart .cpp-map:

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

Dan definiearje wy de te kompilearjen bibleteek (myfeature), dy't sil bestean út wat waard krigen yn 'e foarige stap .cpp-map. De nije bibleteek fereasket fansels besteande kopteksten, en om dit te leverjen kin en moat it keppele wurde oan it besteande doel mylib. Boppedat, de ferbining tusken harren is iepenbier, dat betsjut dat alles dêr't it doel sil wêze ferbûn myfeature, sil automatysk de lading en it doel ûntfange mylib (mear oer breimethoden).

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

Folgjende sille wy derfoar soargje dat de nije bibleteek ek is ynstalleare op it systeem:

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

Dêrby moat opmurken wurde dat foar it doel myfeature, as foar mylib in alias mei in foarheaksel is makke Mylib::. Itselde wurdt skreaun foar beide doelen as se eksportearje foar ynstallaasje op it systeem. Dit makket it mooglik om te wurkjen unifoarm mei doelen foar eltse binende skema.

Hjirnei bliuwt alles oer om ienheidstests te keppeljen mei de nije bibleteek (funksje myfunc út 'e titel helle, dus no moatte jo keppelje):

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
 )

Kopteksten (Mylib::mylib) no hoege jo net apart te ferbinen, om't, lykas al neamd, se automatysk ferbûn binne mei de bibleteek (Mylib::myfeature).

En litte wy in pear nuânses tafoegje om dekkingsmjittingen te garandearjen, rekken hâldend mei de nij oankaam biblioteek:

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

Jo kinne mear biblioteken, útfierbere bestannen, ensfh. It makket net út hoe krekt se binnen it projekt mei elkoar ferbûn binne. It ienige wichtige ding is hokker doelen de ynterface fan ús module binne, dat is, se stekke út.

Feroverje

No hawwe wy standert blokmodules, en wy kinne se dominearje: komponearje se yn in struktuer fan elke kompleksiteit, ynstallearje se yn in systeem of keppelje se mei-inoar binnen ien assemblagesysteem.

Ynstallaasje yn it systeem

Ien fan 'e opsjes foar it brûken fan de module is om ús module yn it systeem te ynstallearjen.

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

Dêrnei is it ferbûn mei in oar projekt mei it kommando find_package.

find_package(Mylib 1.0 REQUIRED)

Ferbining as submodule

In oare opsje is om de map mei ús projekt te ferbinen mei in oar projekt as submodule mei it kommando add_subdirectory.

Gebrûk

De binende metoaden binne oars, mar it resultaat is itselde. Yn beide gefallen sille doelen beskikber wêze yn it projekt mei ús module Mylib::myfeature и Mylib::mylib, dat kin brûkt wurde, bygelyks, sa:

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

Spesifyk yn ús gefal, de biblioteek Mylib::myfeature moatte wurde ferbûn as it nedich is om te keppeljen mei de bibleteek libmyfeature. As d'r genôch kopteksten binne, dan is it wurdich de bibleteek te brûken Mylib::mylib.

CMake-doelen kinne lestich wêze, bygelyks, allinich bedoeld om guon eigenskippen, ôfhinklikens, ensfh. Tagelyk komt it wurkjen mei har op deselde wize foar.

Dat moasten wy krije.

Boarne: www.habr.com

Add a comment