C++ agus CMake - deartháireacha go deo, cuid II

C++ agus CMake - deartháireacha go deo, cuid II

Sa chuid roimhe seo Labhair an scéal siamsúil seo faoi leabharlann ceanntásc a eagrú laistigh de ghineadóir córais tógála CMake.

An uair seo cuirfimid leabharlann tiomsaithe leis, agus labhróimid freisin faoi mhodúil a nascadh lena chéile.

Mar a bhí roimhe seo, is féidir leo siúd atá mífhoighneach láithreach téigh go dtí an stór nuashonraithe agus déan teagmháil le gach rud le do lámha féin.


Ábhar

  1. Roinn
  2. Conquer

Roinn

Is é an chéad rud is gá dúinn a dhéanamh chun ár n-ardsprioc a bhaint amach ná na bogearraí a fhorbraímid a roinnt ina mbloic uilíocha iargúlta atá aonfhoirmeach ó thaobh an úsáideora de.

Sa chéad chuid, rinneadh cur síos ar bhloc caighdeánach den sórt sin - tionscadal le leabharlann ceanntásc. Anois cuirimis leabharlann tiomsaithe lenár dtionscadal.

Chun seo a dhéanamh, déanaimis cur i bhfeidhm na feidhme a bhaint amach myfunc i leith .cpp-comhad:

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

Ansin sainímid an leabharlann atá le tiomsú (myfeature), a bheidh comhdhéanta den méid a fuarthas sa chéim roimhe seo .cpp-chomhad. Is léir go dteastaíonn ceanntásca reatha ón leabharlann nua, agus chun é seo a sholáthar, is féidir agus ba chóir go mbeadh sé ceangailte leis an gcuspóir atá ann faoi láthair. mylib. Thairis sin, tá an nasc eatarthu poiblí, rud a chiallaíonn go mbeidh gach rud a mbeidh an sprioc ceangailte leis myfeature, gheobhaidh sé an t-ualach agus an sprioc go huathoibríoch mylib (tuilleadh faoi mhodhanna cniotála).

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

Ansin, déanfaimid cinnte go bhfuil an leabharlann nua suiteáilte ar an gcóras freisin:

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

Ba chóir a thabhairt faoi deara gur chun na críche sin myfeature, Maidir le mylib cruthaíodh ailias le réimír Mylib::. Scríobhtar an rud céanna don dá chuspóir agus iad á n-onnmhairiú lena suiteáil ar an gcóras. Fágann sé seo gur féidir oibriú go haonfhoirmeach le spriocanna d’aon cheann scéim cheangailteach.

Ina dhiaidh sin, níl fágtha ach tástálacha aonaid a nascadh leis an leabharlann nua (feidhm myfunc tógtha as an teideal, mar sin anois ní mór duit nasc a dhéanamh):

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
 )

Ceannteidil (Mylib::mylib) anois ní gá duit ceangal ar leithligh a dhéanamh, mar, mar a luadh cheana, tá siad ceangailte go huathoibríoch leis an leabharlann (Mylib::myfeature).

Agus cuirimis cúpla nuances leis chun tomhais clúdaigh a chinntiú ag cur san áireamh an leabharlann nua-theacht:

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

Is féidir leat níos mó leabharlanna, earraí inrite, etc. Is cuma cé chomh díreach agus atá siad ceangailte lena chéile laistigh den tionscadal. Is é an t-aon rud atá tábhachtach ná cé na spriocanna atá mar chomhéadan ár modúl, is é sin, go gcloíonn siad amach.

Conquer

Anois tá blocmhodúil chaighdeánacha againn, agus is féidir linn ceannas a ghlacadh orthu: iad a chumadh i struchtúr d'aon chastacht, iad a shuiteáil i gcóras nó iad a nascadh le chéile laistigh de chóras tionóil amháin.

Suiteáil isteach sa chóras

Ceann de na roghanna chun an modúl a úsáid ná ár modúl a shuiteáil sa chóras.

cmake --build путь/к/сборочной/директории --target install

Tar éis sin, tá sé ceangailte le haon tionscadal eile ag baint úsáide as an ordú find_package.

find_package(Mylib 1.0 REQUIRED)

Ceangal mar fhomhodúl

Rogha eile ná an fillteán lenár dtionscadal a nascadh le tionscadal eile mar fhomhodúl ag baint úsáide as an ordú add_subdirectory.

Úsáid

Tá na modhanna ceangailteach difriúil, ach tá an toradh mar an gcéanna. Sa dá chás, beidh spriocanna ar fáil sa tionscadal ag baint úsáide as ár modúl Mylib::myfeature и Mylib::mylib, ar féidir a úsáid, mar shampla, mar seo:

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

Go sonrach inár gcás, an leabharlann Mylib::myfeature a cheangal nuair is gá nascadh leis an leabharlann libmyfeature. Má tá go leor ceanntásca ann, is fiú an leabharlann a úsáid Mylib::mylib.

Is féidir le spriocanna CMake a bheith deacair, mar shampla, atá beartaithe ach chun roinnt maoine, spleáchais, etc. Ag an am céanna, tarlaíonn oibriú leo ar an mbealach céanna.

Sin an méid a theastaigh uainn a fháil.

Foinse: will.com

Add a comment