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

сэтгэгдэл нэмэх