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

අදහස් එක් කරන්න