C++ és CMake – örök testvérek, II. rész

C++ és CMake – örök testvérek, II. rész

Az előző részben erről a szórakoztató történetről a CMake build rendszer keretein belüli fejlesztési könyvtár felépítéséről volt szó.

Ezúttal egy fordítható könyvtárat adunk hozzá, és megvitatjuk a modulok összekapcsolását egymással.

Mint korábban, akik sietnek, ugrhatnak egyből az aktualizált repóba és kipróbálhatják mindent a saját kezük által.


Tartalom

  1. Osztályozás
  2. Uralom

Osztályozás

Az első dolog, amit meg kell tennünk a magas célunk eléréséhez, az, hogy a fejlesztett szoftvert univerzális, elszigetelt blokkokra bontjuk, amelyeket a felhasználó szempontjából egységes szempontból kezelünk.

Az első részben egy ilyen standard blokkot írtunk le – egy projektet fejlesztési könyvtárral. Most azonban hozzáadunk a projektünkhöz egy fordítható könyvtárat.

Ehhez kiemeljük a myfunc függvény megvalósítását egy külön .cpp-fájlba:

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

         ~  lásd 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 
+
+namespace mylib
+{
+    bool myfunc (mystruct)
+    {
+        return true;
+    }
+}

Ezután definiáljuk a fordítható könyvtárat (myfeature), amely az előző lépésből nyert .cpp-fájlra fog épülni. Az új könyvtárnak nyilvánvalóan szüksége van a már létező fejlécfájlokra, és ennek biztosítása érdekében összekapcsolhatjuk a meglévő céllal mylib. Az összekapcsolás nyilvános, ami azt jelenti, hogy bármi, amihez csatlakoztatva van a cél myfeature, automatikusan megkapja a célt mylib (részletesen a kapcsolódási módokról).

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)

+###################################################################################################
+##
+##      Fordítható könyvtár
+##
+###################################################################################################
+
+add_library(myfeature src/mylib/myfeature.cpp)
+target_link_libraries(myfeature PUBLIC mylib)
+
+add_library(Mylib::myfeature ALIAS myfeature)
+

Ezután gondoskodunk arról, hogy az új könyvtár is települjön a rendszerbe:

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

Fontos figyelembe venni, hogy a cél érdekében myfeature, akárcsak mylib pszeudonim lett létrehozva a következő előtaggal Mylib::. Ugyanez érvényes mindkét célra, amikor azokat exportáljuk a rendszerbe való telepítés céljából. Ez lehetővé teszi, hogy egységes módon dolgozzunk a célokkal bármilyen kapcsolati séma.

Ezután a modul teszteket a új könyvtárral kell összekapcsolni (a funkciót myfunc kivettük a fejlécből, így most már linkelni kell):

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
)

A fejléc fájlok (Mylib::mylib) most már külön nem szükségesek, mert, ahogyan már említettük, automatikusan csatlakoznak a könyvtárral együtt (Mylib::myfeature).

És hozzáadunk néhány részletet, hogy biztosítsuk a lefedettség méréseket az újonnan érkezett könyvtárral kapcsolatban:

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

További könyvtárakat, végrehajtható fájlokat stb. lehet hozzáadni. Ebben az esetben nem számít, hogy pontosan hogyan kapcsolódnak egymáshoz a projekt keretein belül. Csak az a fontos, hogy mely célok képezik modulunk interfészét, azaz amelyek kívülről elérhetők.

Uralom

Mostantól vannak standard modulblokkjaink, és uralkodhatunk felettük: bármilyen bonyolultságú struktúrát alkothatunk belőlük, telepítve őket a rendszerbe, vagy összekapcsolva őket egyetlen építési rendszer keretein belül.

Rendszerbe telepítés

Az egyik lehetőség a modul használatára — a modulunk telepítése a rendszerbe.

cmake --build útvonal/a/összefoglaló/igazgatóság --target install

Ezután bármely más projekthez csatlakoztatható a következő parancs segítségével find_package.

find_package(Mylib 1.0 REQUIRED)

Almodulként való csatlakozás

Egy másik lehetőség — a mappánk csatlakoztatása egy másik projekthez almodulként a következő parancs segítségével add_subdirectory.

Használat

A kapcsolati módok különbözőek, de az eredmény mindkét esetben ugyanaz. Mind a két esetben elérhetők lesznek a célok a projektben, amely a modulunkat használja. Mylib::myfeature és Mylib::mylib, amelyek például így használhatók:

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

Konkrét esetben a könyvtárat Mylib::myfeature akkor kell csatlakoztatni, amikor szükséges összekapcsolni a könyvtárral libmyfeature. Ha elegendő a fejlécekből, akkor érdemes a könyvtárat használni. Mylib::mylib.

A CMake-célok trükkösek lehetnek, például úgy tervezték őket, hogy csak bizonyos tulajdonságokat, függőségeket és hasonlókat továbbítsanak. Ezzel egyes formában dolgozunk velük.

Amit el kellett érni.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster