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 мақсаттары қиын болуы мүмкін, мысалы, тек кейбір сипаттарды, тәуелділіктерді және т.б. жіберуге арналған. Сонымен бірге олармен жұмыс істеу де осылай жүреді.

Бұл бізге жетуіміз керек еді.

Ақпарат көзі: www.habr.com

пікір қалдыру