C++ او CMake - د تل لپاره وروڼه، دویمه برخه

C++ او CMake - د تل لپاره وروڼه، دویمه برخه

په تیره برخه کې دا ساتیرۍ کیسه د 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

Add a comment