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

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ