C ++ sarta CMake - baraya salamina, bagian II

C ++ sarta CMake - baraya salamina, bagian II

Dina bagian saméméhna Carita ngahibur ieu nyarioskeun ngeunaan organisasi perpustakaan lulugu dina kerangka generator sistem ngawangun CMake.

waktos Ieu kami bakal nambahan perpustakaan disusun ka dinya, sarta ogé ngobrol ngeunaan linking modul saling.

Sapertos sateuacanna, anu teu sabar tiasa langsung buka gudang diropéa jeung toél sagalana ku leungeun anjeun.


eusi

  1. ngabagi
  2. Aturan

ngabagi

Hal kahiji anu kedah dilakukeun pikeun ngahontal tujuan anu luhur nyaéta ngabagi parangkat lunak anu dikembangkeun kana blok terasing universal anu seragam tina sudut pandang pangguna.

Dina bagian kahiji dijelaskeun blok wangunan misalna - proyék kalawan perpustakaan lulugu. Ayeuna hayu urang tambahkeun perpustakaan anu disusun pikeun proyék urang.

Jang ngalampahkeun ieu, urang bakal nyandak kaluar palaksanaan fungsi myfunc kana misah .cpp-file:

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

Teras we ngartikeun perpustakaan anu bakal dikompilasi (myfeature), nu bakal diwangun ku diala dina hambalan saméméhna .cpp- file. Perpustakaan anyar écés peryogi header anu tos aya, sareng pikeun nyayogikeun ieu, éta tiasa sareng kedah dihubungkeun sareng tujuan anu tos aya. mylib. Leuwih ti éta, beungkeutan antara aranjeunna umum, nu hartina sagalana nu udagan bakal disambungkeun myfeature, otomatis bakal nampi beban sareng target mylib (langkung seueur ngeunaan cara ngiket).

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

Salajengna, urang bakal mastikeun yén perpustakaan anyar ogé dipasang dina sistem:

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

Ieu kudu dicatet yén pikeun tujuan myfeature, sakumaha keur mylib landian dijieun kalawan awalan a Mylib::. Hal anu sami diserat pikeun duanana tujuan nalika ngékspor aranjeunna pikeun dipasang dina sistem. Hal ieu ngamungkinkeun pikeun digawé seragam jeung tujuan pikeun sagala skéma mengikat.

Saatos éta, éta tetep ngahijikeun tés unit sareng perpustakaan énggal (fungsi myfunc dipindahkeun kaluar tina lulugu, jadi ayeuna anjeun kudu numbu):

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
 )

Judul (Mylib::mylib) ayeuna anjeun henteu kedah nyambung kapisah, sabab, sakumaha anu parantos disebatkeun, aranjeunna otomatis dihubungkeun sareng perpustakaan (Mylib::myfeature).

Sareng hayu urang tambahkeun sababaraha nuansa pikeun mastikeun pangukuran cakupan kalayan merhatikeun perpustakaan anu nembé sumping:

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

Anjeun tiasa nambihan langkung seueur perpustakaan, executable, jsb. Henteu janten masalah kumaha persisna aranjeunna dirajut babarengan dina kerangka proyék. Hiji-hijina hal anu penting nyaéta anu targétna nyaéta antarmuka modul urang, nyaéta, lengket.

Aturan

Ayeuna urang gaduh modul-blok standar, sareng urang tiasa maréntahkeunana: nyusun struktur pajeulitna ti aranjeunna, pasang kana sistem atanapi ngahubungkeun aranjeunna dina hiji sistem assembly tunggal.

Pamasangan sistem

Salah sahiji pilihan pikeun ngagunakeun modul nyaéta masang modul kami dina sistem.

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

Sanggeus éta, éta disambungkeun ka sagala proyék séjén maké paréntah find_package.

find_package(Mylib 1.0 REQUIRED)

Nyambungkeun salaku submodule a

Pilihan séjén nyaéta pikeun nyambungkeun polder sareng proyék kami ka proyék sanés salaku submodule nganggo paréntah add_subdirectory.

pamakean

Métode ngariung béda, tapi hasilna sami. Dina duanana kasus, dina proyék ngagunakeun modul urang, tujuan bakal sadia Mylib::myfeature и Mylib::mylib, anu tiasa dianggo, contona, sapertos kieu:

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

Husus, dina hal urang, perpustakaan Mylib::myfeature anjeun kedah nyambungkeun nalika anjeun kedah ngaitkeun perpustakaan libmyfeature. Upami aya cukup header, maka anjeun kedah nganggo perpustakaan Mylib::mylib.

Target CMake tiasa rumit, contona, ngan ukur pikeun neraskeun sababaraha pasipatan, kagumantungan, jsb. Dina waktos anu sami, aranjeunna tiasa dianggo dina cara anu sami.

Anu anjeun kedah kéngingkeun.

sumber: www.habr.com

Tambahkeun komentar