سي ++ ۽ سي ايمڪ - ڀائر هميشه لاء، حصو II

سي ++ ۽ سي ايمڪ - ڀائر هميشه لاء، حصو II

پوئين حصي ۾ هي تفريحي ڪهاڻي CMake بلڊ سسٽم جنريٽر جي اندر هيڊر لائبريري کي منظم ڪرڻ بابت ڳالهايو.

هن ڀيري اسان ان ۾ هڪ مرتب ڪيل لائبريري شامل ڪنداسين، ۽ ماڊلز کي هڪ ٻئي سان ڳنڍڻ بابت پڻ ڳالهائينداسين.

اڳي وانگر، جيڪي بي صبرا آهن، اهي فوري طور تي ڪري سگهن ٿا اپڊيٽ ٿيل مخزن ڏانھن وڃو ۽ هر شيء کي پنهنجي هٿن سان ڇڪيو.


Contents

  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)

ڪنيڪشن هڪ submodule طور

هڪ ٻيو اختيار اهو آهي ته فولڊر کي اسان جي پروجيڪٽ سان ٻئي منصوبي سان ڪمانڊ استعمال ڪندي ذيلي ماڊل طور ڳنڍيو 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

تبصرو شامل ڪريو