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 максаттары татаал болушу мүмкүн, мисалы, кээ бир касиеттерди, көз карандылыктарды ж.б. өткөрүү үчүн гана арналган. Ошол эле учурда алар менен иштөө да ушундай жол менен ишке ашат.

Мына ошону алышыбыз керек болчу.

Source: www.habr.com

Комментарий кошуу