C++ thiab CMake - cov kwv tij mus ib txhis, ntu II

C++ thiab CMake - cov kwv tij mus ib txhis, ntu II

Hauv ntu dhau los Zaj dab neeg lom zem no tau tham txog kev teeb tsa lub tsev qiv ntawv header hauv CMake tsim lub tshuab hluav taws xob.

Lub sij hawm no peb yuav ntxiv ib lub tsev qiv ntawv muab tso ua ke rau nws, thiab kuj tham txog kev txuas cov modules nrog ib leeg.

Raws li yav dhau los, cov neeg uas tsis siab ntev tuaj yeem tam sim ntawd mus rau qhov chaw khaws cia tshiab thiab kov txhua yam ntawm koj tus kheej tes.


Txheem

  1. Faib
  2. kov yeej

Faib

Thawj qhov uas peb yuav tsum tau ua kom ua tiav peb lub hom phiaj siab tshaj plaws yog faib cov software uas peb txhim kho rau hauv universal, cais cov blocks uas tsis sib xws los ntawm tus neeg siv qhov kev xav.

Nyob rau hauv thawj feem, xws li ib tug qauv thaiv tau piav - ib qhov project nrog ib tug header tsev qiv ntawv. Tam sim no cia peb ntxiv ib lub tsev qiv ntawv tso ua ke rau peb qhov project.

Txhawm rau ua qhov no, cia peb tshem tawm qhov kev ua haujlwm ntawm kev ua haujlwm myfunc hauv ib qho cais .cpp-file:

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

Tom qab ntawd peb txhais lub tsev qiv ntawv kom muab tso ua ke (myfeature), uas yuav muaj cov khoom tau txais hauv cov kauj ruam dhau los .cpp- ntaub ntawv. Lub tsev qiv ntawv tshiab pom tseeb yuav tsum muaj cov headers uas twb muaj lawm, thiab txhawm rau muab qhov no, nws tuaj yeem thiab yuav tsum tau khi rau lub hom phiaj uas twb muaj lawm. mylib. Ntxiv mus, kev sib txuas ntawm lawv yog pej xeem, uas txhais tau hais tias txhua yam uas lub hom phiaj yuav txuas nrog myfeature, yuav tau txais cov load thiab lub hom phiaj mylib (Xav paub ntau ntxiv txog txoj kev knitting).

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

Tom ntej no, peb yuav xyuas kom meej tias lub tsev qiv ntawv tshiab kuj tau nruab rau ntawm qhov system:

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

Nws yuav tsum tau muab sau tseg tias rau lub hom phiaj myfeature, as rau mylib ib tug alias nrog ib tug prefix tau tsim Mylib::. Tib yam yog sau rau ob lub hom phiaj thaum xa tawm lawv rau kev teeb tsa ntawm lub system. Qhov no ua rau nws muaj peev xwm ua haujlwm sib npaug nrog cov hom phiaj rau ib qho twg kev khi txoj kev.

Tom qab ntawd, txhua yam uas tseem tshuav yog txhawm rau txuas cov ntawv xeem nrog lub tsev qiv ntawv tshiab (function myfunc tshem tawm ntawm lub npe, yog li tam sim no koj yuav tsum txuas):

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
 )

Cov ntsiab lus (Mylib::mylib) tam sim no koj tsis tas yuav txuas sib cais, vim hais tias, raws li twb tau hais lawm, lawv tau txuas nrog lub tsev qiv ntawv (Mylib::myfeature).

Thiab cia peb ntxiv ob peb nuances los xyuas kom meej qhov kev ntsuas kev ntsuas coj mus rau hauv tus account lub tsev qiv ntawv tshiab tuaj txog:

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

Koj tuaj yeem ntxiv ntau cov tsev qiv ntawv, executables, thiab lwm yam. Nws tsis muaj teeb meem li cas raws nraim lawv txuas rau ib leeg hauv qhov project. Qhov tseem ceeb tshaj plaws yog cov hom phiaj twg yog qhov interface ntawm peb cov module, uas yog, lawv lo tawm.

kov yeej

Tam sim no peb muaj cov qauv thaiv cov qauv, thiab peb tuaj yeem ua tus tswj hwm lawv: sau lawv rau hauv cov qauv ntawm txhua qhov nyuaj, txhim kho lawv rau hauv ib qho system lossis txuas lawv ua ke hauv ib qho kev sib dhos.

Installation nyob rau hauv lub system

Ib qho ntawm cov kev xaiv rau kev siv lub module yog rau nruab peb module rau hauv lub system.

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

Tom qab ntawd, nws txuas nrog rau lwm qhov project siv cov lus txib find_package.

find_package(Mylib 1.0 REQUIRED)

Kev sib txuas ua ib qho submodule

Lwm qhov kev xaiv yog txuas cov ntawv tais ceev tseg nrog peb qhov project mus rau lwm qhov project raws li submodule siv cov lus txib add_subdirectory.

Siv

Txoj kev khi txoj kev sib txawv, tab sis qhov tshwm sim yog tib yam. Nyob rau hauv ob qho tib si, cov hom phiaj yuav muaj nyob rau hauv peb tes num siv peb module Mylib::myfeature ΠΈ Mylib::mylib, uas tuaj yeem siv tau, piv txwv li, zoo li no:

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

Tshwj xeeb hauv peb cov ntaub ntawv, lub tsev qiv ntawv Mylib::myfeature yuav tsum tau txuas nrog thaum tsim nyog txuas nrog lub tsev qiv ntawv libmyfeature. Yog tias muaj cov headers txaus, ces nws tsim nyog siv lub tsev qiv ntawv Mylib::mylib.

CMake lub hom phiaj tuaj yeem ua kom yuam kev, piv txwv li, npaj tsuas yog xa mus rau qee yam khoom, kev vam khom, thiab lwm yam. Tib lub sijhawm, kev ua haujlwm nrog lawv tshwm sim tib yam.

Qhov ntawd yog qhov peb xav tau.

Tau qhov twg los: www.hab.com

Ntxiv ib saib