C++ sy CMake - rahalahy mandrakizay, fizarana II

C++ sy CMake - rahalahy mandrakizay, fizarana II

Ao amin'ny ampahany teo aloha Ity tantara mampiala voly ity dia niresaka momba ny fikarakarana tranomboky lohatenin'ny mpamorona rafitra fananganana CMake.

Amin'ity indray mitoraka ity dia hanampy tranomboky natambatra ho azy io isika, ary hiresaka momba ny fampifandraisana ireo modules amin'ny tsirairay.

Toy ny teo aloha dia afaka avy hatrany ireo tsy manam-paharetana mandehana any amin'ny tahiry nohavaozina ary tendreo amin'ny tananao ny zavatra rehetra.


afa-po

  1. Zarao
  2. handresy

Zarao

Ny zavatra voalohany tokony hataontsika mba hanatratrarana ny tanjona ambony indrindra dia ny mizara ny logiciel novolavolainay ho blocs mitoka-monina izay mitovy amin'ny fomba fijerin'ny mpampiasa.

Ao amin'ny tapany voalohany dia nofaritana ny sakana mahazatra toy izany - tetikasa misy tranomboky misy lohateny. Andeha isika hanampy tranomboky natambatra amin'ny tetikasantsika.

Mba hanaovana izany, andeha horaisina ny fampiharana ny asa myfunc amin'ny misaraka .cpp-rakitra:

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

Avy eo dia mamaritra ny tranomboky hangonina (myfeature), izay ahitana ny zavatra azo tamin'ny dingana teo aloha .cpp-rakitra. Ny trano famakiam-boky vaovao dia mazava ho azy fa mitaky lohapejy efa misy, ary mba hanomezana izany dia azo atao ary tokony hifandray amin'ny tanjona efa misy. mylib. Ankoatr'izay, ny fifandraisana misy eo amin'izy ireo dia ampahibemaso, izay midika fa ny zavatra rehetra hampifandraisana ny tanjona myfeature, dia handray ho azy ny entana sy ny tanjona mylib (bebe kokoa momba ny knitting fomba).

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

Manaraka, ho azo antoka fa ny tranomboky vaovao dia napetraka ao amin'ny rafitra ihany koa:

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

Marihina fa noho ny tanjona myfeature, raha ny amin'ny mylib natsangana ny solon'anarana misy prefix Mylib::. Toy izany koa no voasoratra ho an'ny tanjona roa rehefa manondrana azy ireo ho an'ny fametrahana amin'ny rafitra. Izany dia ahafahana miasa mitovy amin'ny tanjona na inona na inona tetika mamatotra.

Aorian'izany, ny hany sisa tavela dia ny mampifandray ny fitsapana unit amin'ny tranomboky vaovao (function myfunc nesorina tamin'ny lohateny, ka mila mampifandray ianao izao):

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
 )

Lohateny (Mylib::mylib) izao dia tsy mila mifandray misaraka ianao, satria, araka ny efa voalaza, dia mifandray ho azy miaraka amin'ny tranomboky (Mylib::myfeature).

Ary ndao ampio ny nuance roa mba hiantohana ny fandrefesana fandrakofana amin'ny fiheverana ny tranomboky vao tonga:

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

Azonao atao ny manampy trano famakiam-boky, executables, sns. Tsy maninona na ahoana marina no ifandraisan'izy ireo ao anatin'ilay tetikasa. Ny hany zava-dehibe dia ny lasibatra amin'ny seha-pifaneraserana amin'ny module misy antsika, izany hoe mijanona izy ireo.

handresy

Amin'izao fotoana izao dia manana maody sakana manara-penitra isika, ary afaka mibahana azy ireo isika: mamorona azy ireo ho rafitra sarotra, mametraka azy ireo ao anaty rafitra iray na mampifandray azy ireo ao anatin'ny rafitra fivoriambe tokana.

Fametrahana ao amin'ny rafitra

Ny iray amin'ireo safidy amin'ny fampiasana ny maody dia ny fametrahana ny module ao amin'ny rafitra.

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

Aorian'izany dia mifandray amin'ny tetikasa hafa mampiasa ny baiko izy io find_package.

find_package(Mylib 1.0 REQUIRED)

Fifandraisana toy ny submodule

Safidy iray hafa dia ny mampifandray ny lahatahiry amin'ny tetikasantsika amin'ny tetikasa hafa ho submodule mampiasa ny baiko add_subdirectory.

ny fampiasana ny

Ny fomba famatorana dia samy hafa, fa ny vokatra dia mitovy. Amin'ireo tranga roa ireo, ny tanjona dia ho hita ao amin'ny tetikasa amin'ny fampiasana ny module Mylib::myfeature ΠΈ Mylib::mylib, izay azo ampiasaina, ohatra, toy izao:

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

Amin'ny ankapobeny, ny tranomboky Mylib::myfeature mila mifandray rehefa ilaina ny mifandray amin'ny tranomboky libmyfeature. Raha toa ka ampy ny lohapejy, dia mendrika ny mampiasa ny tranomboky Mylib::mylib.

Ny kendrena CMake dia mety ho saro-takarina, ohatra, natao handefasana fananana, fiankinan-doha, sns. Mandritra izany fotoana izany, ny fiaraha-miasa amin'izy ireo dia mitranga amin'ny fomba mitovy.

Izany no nilainay azo.

Source: www.habr.com

Add a comment