C++ ja CMake - veljekset ikuisesti, osa II

C++ ja CMake - veljekset ikuisesti, osa II

Edellisessä osassa Tämä viihdyttävä tarina puhui otsikkokirjaston järjestämisestä CMake build system generaattorissa.

Tällä kertaa lisäämme siihen kootun kirjaston ja puhumme myös moduulien yhdistämisestä toisiinsa.

Kuten ennenkin, kärsimättömät voivat heti mene päivitettyyn arkistoon ja kosketa kaikkea omin käsin.


Pitoisuus

  1. Jakaa
  2. Valloittaa

Jakaa

Ensimmäinen asia, joka meidän on tehtävä saavuttaaksemme korkean tavoitteemme, on jakaa kehittämämme ohjelmisto yleiskäyttöisiksi, erillisiksi lohkoiksi, jotka ovat yhdenmukaisia ​​käyttäjän näkökulmasta.

Ensimmäisessä osassa kuvattiin tällainen standardilohko - projekti, jossa on otsikkokirjasto. Lisätään nyt koottu kirjasto projektiimme.

Tätä varten otetaan pois toiminnon toteutus myfunc erillisessä .cpp-tiedosto:

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

Sitten määritämme käännettävän kirjaston (myfeature), joka koostuu edellisessä vaiheessa saadusta .cpp-tiedosto. Uusi kirjasto vaatii luonnollisesti olemassa olevia otsikoita, ja tämän tarjoamiseksi se voidaan ja pitää sitoa olemassa olevaan tarkoitukseen mylib. Lisäksi niiden välinen yhteys on julkinen, mikä tarkoittaa, että kaikki mihin kohde liitetään myfeature, vastaanottaa automaattisesti kuorman ja kohteen mylib (lisää neulontamenetelmistä).

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

Seuraavaksi varmistamme, että uusi kirjasto on myös asennettu järjestelmään:

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

On huomattava, että tarkoitukseen myfeature, mitä tulee mylib alias etuliitteellä luotiin Mylib::. Sama kirjoitetaan molemmille tarkoituksille, kun ne viedään järjestelmään asennettavaksi. Tämä tekee mahdolliseksi työskennellä yhtenäisesti minkä tahansa tavoitteiden kanssa sitova järjestelmä.

Tämän jälkeen ei enää tarvitse kuin linkittää yksikkötestit uuteen kirjastoon (funktio myfunc poistettu otsikosta, joten sinun on nyt linkitettävä):

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
 )

Otsikot (Mylib::mylib) nyt sinun ei tarvitse muodostaa yhteyttä erikseen, koska, kuten jo mainittiin, ne yhdistetään automaattisesti kirjaston mukana (Mylib::myfeature).

Ja lisätään pari vivahdetta peittomittausten varmistamiseksi ottaen huomioon juuri saapunut kirjasto:

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

Voit lisätä lisää kirjastoja, suoritettavia tiedostoja jne. Sillä ei ole väliä, kuinka tarkasti ne liittyvät toisiinsa projektin sisällä. Ainoa tärkeä asia on, mitkä kohteet ovat moduulimme käyttöliittymä, eli ne jäävät ulos.

Valloittaa

Nyt meillä on vakiolohkomoduulit, ja voimme hallita niitä: koota niistä minkä tahansa monimutkaisen rakenteen, asentaa ne järjestelmään tai yhdistää ne yhteen kokoonpanojärjestelmään.

Asennus järjestelmään

Yksi moduulin käyttömahdollisuuksista on asentaa moduulimme järjestelmään.

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

Sen jälkeen se yhdistetään mihin tahansa muuhun projektiin komennolla find_package.

find_package(Mylib 1.0 REQUIRED)

Liitäntä alimoduulina

Toinen vaihtoehto on yhdistää projektimme kansio toiseen projektiin alimoduuliksi komennolla add_subdirectory.

Käyttää

Sidosmenetelmät ovat erilaisia, mutta tulos on sama. Molemmissa tapauksissa tavoitteet ovat saatavilla projektissa käyttämällä moduuliamme Mylib::myfeature и Mylib::mylib, jota voidaan käyttää esimerkiksi näin:

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

Erityisesti meidän tapauksessamme kirjasto Mylib::myfeature on yhdistettävä, kun se on linkitettävä kirjastoon libmyfeature. Jos otsikoita on tarpeeksi, niin kirjastoa kannattaa käyttää Mylib::mylib.

CMake-kohteet voivat olla hankalia, esimerkiksi tarkoitettu vain joidenkin ominaisuuksien, riippuvuuksien jne. välittämiseen. Samaan aikaan heidän kanssaan työskentely tapahtuu samalla tavalla.

Se meidän piti saada.

Lähde: will.com

Lisää kommentti