C++ və CMake - əbədi qardaşlar, II hissə

C++ və CMake - əbədi qardaşlar, II hissə

Əvvəlki hissədə Bu əyləncəli hekayə CMake qurma sistem generatoru daxilində başlıq kitabxanasının təşkilindən bəhs etdi.

Bu dəfə biz ona tərtib edilmiş kitabxana əlavə edəcəyik, həmçinin modulları bir-biri ilə əlaqələndirməkdən danışacağıq.

Əvvəlki kimi səbirsiz olanlar dərhal edə bilərlər yenilənmiş depoya keçin və hər şeyə öz əllərinizlə toxunun.


Məzmun

  1. Bölmək
  2. Fəth etmək

Bölmək

Uca məqsədimizə çatmaq üçün etməli olduğumuz ilk şey, hazırladığımız proqram təminatını istifadəçi baxımından vahid olan universal, təcrid olunmuş bloklara bölməkdir.

Birinci hissədə belə bir standart blok təsvir edilmişdir - başlıq kitabxanası olan bir layihə. İndi isə layihəmizə tərtib edilmiş kitabxana əlavə edək.

Bunu etmək üçün funksiyanın icrasını çıxaraq myfunc ayrılıqda .cpp-fayl:

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

Sonra tərtib ediləcək kitabxananı müəyyənləşdiririk (myfeature), əvvəlki addımda əldə edilənlərdən ibarət olacaq .cpp-fayl. Yeni kitabxana açıq şəkildə mövcud başlıqları tələb edir və bunu təmin etmək üçün o, mövcud məqsədlə əlaqələndirilə bilər və olmalıdır. mylib. Üstəlik, onlar arasındakı əlaqə ictimaidir, yəni hədəfin bağlanacağı hər şey deməkdir myfeature, yükü və hədəfi avtomatik qəbul edəcək mylib (toxuculuq üsulları haqqında daha çox).

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

Sonra, yeni kitabxananın sistemdə də quraşdırıldığından əmin olacağıq:

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

Qeyd etmək lazımdır ki, məqsəd üçün myfeature, gəldikdə mylib prefiksi olan ləqəb yaradıldı Mylib::. Sistemdə quraşdırmaq üçün onları ixrac edərkən hər iki məqsəd üçün eyni şey yazılır. Bu, istənilən məqsədlə vahid şəkildə işləməyi mümkün edir bağlama sxemi.

Bundan sonra, vahid testləri yeni kitabxana ilə əlaqələndirmək qalır (funksiya myfunc başlıqdan çıxarıldı, buna görə indi əlaqə yaratmalısınız):

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
 )

başlıqlar (Mylib::mylib) indi ayrıca qoşulmağa ehtiyac yoxdur, çünki artıq qeyd edildiyi kimi, onlar kitabxana ilə birlikdə avtomatik olaraq bağlanır (Mylib::myfeature).

Yeni gələn kitabxananı nəzərə alaraq əhatə ölçmələrini təmin etmək üçün bir neçə nüans əlavə edək:

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

Daha çox kitabxana, icra olunan fayl və s. əlavə edə bilərsiniz. Onların layihə çərçivəsində bir-biri ilə necə dəqiq bağlı olmasının əhəmiyyəti yoxdur. Yeganə vacib olan odur ki, hansı hədəflər modulumuzun interfeysidir, yəni kənarda qalır.

Fəth etmək

İndi bizim standart blok modullarımız var və biz onlara üstünlük verə bilərik: onları istənilən mürəkkəblikdə bir quruluşa çevirmək, onları sistemə quraşdırmaq və ya vahid montaj sistemi daxilində birləşdirmək.

Sistemə quraşdırma

Moduldan istifadə variantlarından biri modulumuzu sistemə quraşdırmaqdır.

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

Bundan sonra əmrdən istifadə edərək hər hansı digər layihəyə qoşulur find_package.

find_package(Mylib 1.0 REQUIRED)

Submodul kimi əlaqə

Başqa bir seçim, əmrdən istifadə edərək, submodul olaraq layihəmizlə qovluğu başqa bir layihəyə qoşmaqdır add_subdirectory.

Istifadə

Bağlama üsulları fərqlidir, lakin nəticə eynidir. Hər iki halda, modulumuzdan istifadə edərək layihədə hədəflər mövcud olacaq Mylib::myfeature и Mylib::mylib, məsələn, bu kimi istifadə edilə bilər:

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

Konkret olaraq bizim vəziyyətimizdə kitabxana Mylib::myfeature kitabxana ilə əlaqə yaratmaq lazım olduqda qoşulmaq lazımdır libmyfeature. Kifayət qədər başlıq varsa, kitabxanadan istifadə etməyə dəyər Mylib::mylib.

CMake hədəfləri çətin ola bilər, məsələn, yalnız bəzi xassələri, asılılıqları və s. ötürmək üçün nəzərdə tutulub. Eyni zamanda, onlarla işləmək də eyni şəkildə baş verir.

Bunu əldə etməyimiz lazım idi.

Mənbə: www.habr.com

Добавить комментарий