C++ kanye ne-CMake - bazalwane kuze kube phakade, ingxenye II

C++ kanye ne-CMake - bazalwane kuze kube phakade, ingxenye II

Engxenyeni edlule Le ndaba ejabulisayo ikhulume ngokuhlela umtapo wolwazi ongaphakathi kwe-CMake build system generator.

Kulokhu sizokwengeza umtapo wolwazi ohlanganisiwe kuwo, futhi siphinde sikhulume ngokuxhumanisa amamojula.

Njengangaphambili, labo abangenasineke bangakwazi ngokushesha iya endaweni yokugcina ebuyekeziwe futhi uthinte yonke into ngezandla zakho.


Okuqukethwe

  1. Hlukanisa
  2. Nqoba

Hlukanisa

Into yokuqala okudingeka siyenze ukuze sifinyelele umgomo wethu ophezulu ukuhlukanisa isofthiwe esiyithuthukisayo ibe amabhulokhi ahlukene, angawodwa afanayo ngokombono womsebenzisi.

Engxenyeni yokuqala, i-block standard enjalo yachazwa - iphrojekthi enomtapo wezincwadi wekhanda. Manje ake sengeze umtapo wolwazi ohlanganisiwe kuphrojekthi yethu.

Ukuze wenze lokhu, ake sikhiphe ukuqaliswa komsebenzi myfunc ngokwehlukana .cpp-ifayela:

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;
+    }
+}

Bese sichaza umtapo wolwazi ozohlanganiswa (myfeature), okuzoqukatha lokho okutholwe esinyathelweni sangaphambilini .cpp-ifayela. Umtapo wolwazi omusha ngokusobala udinga izihloko ezikhona, futhi ukuze unikeze lokhu, ungakwazi futhi kufanele uhlanganiswe nenhloso ekhona. mylib. Ngaphezu kwalokho, ukuxhumana phakathi kwabo kusesidlangalaleni, okusho ukuthi konke okuhlosiwe kuzoxhunywa myfeature, izothola ngokuzenzakalelayo umthwalo nethagethi mylib (kabanzi mayelana nezindlela zokuluka).

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)
+

Okulandelayo, sizoqinisekisa ukuthi umtapo wolwazi omusha nawo ufakiwe ohlelweni:

@@ -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)

Kufanele kuqashelwe ukuthi ngenhloso myfeature, ngokwe mylib kwakhiwe isibizo esinesiqalo Mylib::. Okufanayo kubhalelwe izinhloso zombili lapho uzithumela ukuze zifakwe ohlelweni. Lokhu kwenza kube nokwenzeka ukusebenza ngokufanayo nemigomo yanoma iyiphi uhlelo lokubopha.

Ngemva kwalokhu, okusele nje ukuxhumanisa ukuhlolwa kweyunithi nomtapo wolwazi omusha (function myfunc ikhishwe esihlokweni, ngakho-ke manje udinga ukuxhumanisa):

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
 )

Izihloko (Mylib::mylib) manje awudingi ukuxhuma ngokwehlukana, ngoba, njengoba sekushiwo, zixhumeke ngokuzenzakalelayo kanye nomtapo wolwazi (Mylib::myfeature).

Futhi ake sengeze ama-nuances ambalwa ukuze siqinisekise izilinganiso zokufakwa kucatshangelwa umtapo osanda kufika:

@@ -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
     )

Ungangeza amalabhulali amaningi, okusebenzisekayo, njll. Akukhathalekile ukuthi zixhumene kanjani ngqo phakathi kwephrojekthi. Okuwukuphela kwento ebalulekile ukuthi yiziphi izinhloso okuyi-interface yemojula yethu, okungukuthi, ziphuma ngaphandle.

Nqoba

Manje sesinamamojula ajwayelekile ebhulokhi, futhi singawabusa: awahlanganise abe isakhiwo sanoma iyiphi inkimbinkimbi, siwafake ohlelweni noma siwaxhumanise phakathi kwesistimu yomhlangano owodwa.

Ukufakwa ohlelweni

Enye yezinketho zokusebenzisa imojuli ukufaka imojula yethu ohlelweni.

cmake --build ΠΏΡƒΡ‚ΡŒ/ΠΊ/сборочной/Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ --target install

Ngemva kwalokho, ixhunywe kunoma iyiphi enye iphrojekthi kusetshenziswa umyalo find_package.

find_package(Mylib 1.0 REQUIRED)

Ukuxhumana njengemojuli engezansi

Enye inketho ukuxhuma ifolda nephrojekthi yethu kwenye iphrojekthi njenge-submodule usebenzisa umyalo add_subdirectory.

Sebenzisa

Izindlela zokubopha zihlukile, kodwa umphumela uyafana. Kuzo zombili izimo, imigomo izotholakala kuphrojekthi kusetshenziswa imojula yethu Mylib::myfeature ΠΈ Mylib::mylib, engasetshenziswa, isibonelo, kanje:

add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)

Ikakhulukazi esimweni sethu, umtapo wolwazi Mylib::myfeature kudingeka uxhumeke lapho kudingekile ukuxhumana nomtapo wolwazi libmyfeature. Uma kunezihloko ezanele, khona-ke kufanelekile ukusebenzisa umtapo wolwazi Mylib::mylib.

Izinhloso ze-CMake zingakhohlisa, ngokwesibonelo, zihloselwe kuphela ukudlulisa ezinye izakhiwo, okuncikile, njll. Ngesikhathi esifanayo, ukusebenza nabo kwenzeka ngendlela efanayo.

Yilokho ebesikudinga ukuze sikuthole.

Source: www.habr.com

Engeza amazwana