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 ኢላማዎች አስቸጋሪ ሊሆኑ ይችላሉ፣ ለምሳሌ፣ አንዳንድ ንብረቶችን፣ ጥገኞችን፣ ወዘተ ለማስተላለፍ ብቻ የታሰቡ። በተመሳሳይ ጊዜ ከነሱ ጋር አብሮ መስራት በተመሳሳይ መንገድ ይከሰታል.

ማግኘት የሚያስፈልገን ይህንኑ ነው።

ምንጭ: hab.com

አስተያየት ያክሉ