C++ ва CMake - бародарон то абад, қисми II

C++ ва CMake - бародарон то абад, қисми II

Дар кисми гузашта Ин ҳикояи фароғатӣ дар бораи ташкили китобхонаи сарлавҳа дар дохили генератори системаи сохтани CMake сӯҳбат мекард.

Ин дафъа мо ба он китобхонаи тартибдодашуда илова мекунем ва инчунин дар бораи пайваст кардани модулҳо бо ҳамдигар сӯҳбат мекунем.

Мисли пештара, онхое, ки бесаброна хастанд, фавран метавонанд ба анбори навшуда равед ва ҳама чизро бо дасти худ ламс кунед.


Мундариҷа

  1. Тақсим кардан
  2. Ғалаба кардан

Тақсим кардан

Аввалин чизе, ки мо бояд барои ноил шудан ба ҳадафи олиамон анҷом диҳем, тақсим кардани нармафзоре, ки мо таҳия мекунем, ба блокҳои универсалӣ ва ҷудошуда, ки аз нуқтаи назари корбар якхелаанд, аст.

Дар қисми аввал чунин блоки стандартӣ тавсиф карда шуд - лоиҳа бо китобхонаи сарлавҳа. Акнун биёед китобхонаи тартибдодашударо ба лоиҳаи худ илова кунем.

Барои ин, биёед иҷрои функсияро хориҷ кунем myfunc дар алоҳидагӣ .cpp-файл:

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

Сипас, мо китобхонаи тартибдодашударо муайян мекунем (myfeature), ки аз он чизе, ки дар қадами қаблӣ гирифта шудааст, иборат хоҳад буд .cpp-файл. Китобхонаи нав бешубҳа сарлавҳаҳои мавҷударо талаб мекунад ва барои таъмини ин, он метавонад ва бояд бо ҳадафи мавҷуда алоқаманд бошад mylib. Гузашта аз ин, робитаи байни онҳо оммавӣ аст, ки маънои онро дорад, ки ҳама чизе, ки ҳадаф ба он пайваст мешавад myfeature, ба таври худкор бор ва максадро кабул мекунад mylib (бештар дар бораи усулхои бофандагй).

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

Баъдан, мо боварӣ ҳосил мекунем, ки китобхонаи нав низ дар система насб шудааст:

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

Бояд гуфт, ки ба максад myfeature, чунон ки mylib тахаллус бо префикс сохта шуд Mylib::. Барои ҳарду мақсад ҳангоми содироти онҳо барои насб дар система ҳамин чиз навишта мешавад. Ин имкон медиҳад, ки бо ҳадафҳои ҳама яксон кор кунем схемаи ҳатмӣ.

Пас аз ин, танҳо пайваст кардани санҷишҳои воҳид бо китобхонаи нав (функсия myfunc аз сарлавҳа хориҷ карда шудааст, бинобар ин шумо бояд пайванд кунед):

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
 )

Сарлавҳаҳо (Mylib::mylib) акнун ба шумо лозим нест, ки алоҳида пайваст шавед, зеро тавре ки аллакай зикр гардид, онҳо ба таври худкор бо китобхона пайваст мешаванд (Mylib::myfeature).

Ва биёед якчанд нозукиҳоро илова кунем, то андозагирии фарогириро бо назардошти китобхонаи нав воридшуда таъмин кунем:

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

Шумо метавонед бештар китобхонаҳо, иҷрошавандаҳо ва ғайра илова кунед. Муҳим нест, ки онҳо дар доираи лоиҳа чӣ гуна маҳз бо ҳам пайвастанд. Ягона чизи муҳим ин аст, ки кадом ҳадафҳо интерфейси модули мо мебошанд, яъне онҳо берун мемонанд.

Ғалаба кардан

Ҳоло мо модулҳои блоки стандартӣ дорем ва мо метавонем онҳоро бартарӣ диҳем: онҳоро ба сохтори ҳар гуна мураккаб созед, онҳоро ба система насб кунед ё онҳоро дар дохили як системаи ягонаи васлкунӣ пайваст кунед.

Насбкунӣ ба система

Яке аз вариантҳои истифодаи модул ин насб кардани модули мо дар система мебошад.

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

Баъд аз ин, он бо истифода аз фармон ба ягон лоиҳаи дигар пайваст карда мешавад find_package.

find_package(Mylib 1.0 REQUIRED)

Пайвастшавӣ ҳамчун зермодул

Варианти дигар ин пайваст кардани ҷузвдон бо лоиҳаи мо ба лоиҳаи дигар ҳамчун зермодул бо истифода аз фармон мебошад add_subdirectory.

Истифода кунед

Усулҳои бастабандӣ гуногунанд, аммо натиҷа як аст. Дар ҳарду ҳолат, ҳадафҳо дар лоиҳа бо истифода аз модули мо дастрас хоҳанд буд Mylib::myfeature и Mylib::mylib, ки онро метавон истифода бурд, масалан, ба ин монанд:

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

Махсусан дар мо, китобхона Mylib::myfeature дар мавриде, ки бо китобхона пайваст шудан зарур аст, пайваст шудан лозим аст libmyfeature. Агар сарлавҳаҳои кофӣ вуҷуд дошта бошанд, пас истифодаи китобхона меарзад Mylib::mylib.

Ҳадафҳои CMake метавонанд душвор бошанд, масалан, танҳо барои интиқоли баъзе хосиятҳо, вобастагӣ ва ғайра пешбинӣ шудаанд. Дар баробари ин кор бо онхо низ хамин тавр ба амал меояд.

Ин чизест, ки мо бояд ба даст орем.

Манбаъ: will.com

Илова Эзоҳ