C ++ agus CMake - bràithrean gu bràth, pàirt II

C ++ agus CMake - bràithrean gu bràth, pàirt II

Anns a' chuid roimhe Bha an sgeulachd inntinneach seo a’ bruidhinn air leabharlann cinn a chuir air dòigh taobh a-staigh gineadair siostam togail CMake.

An turas seo cuiridh sinn leabharlann cruinn ris, agus bruidhnidh sinn cuideachd mu bhith a’ ceangal mhodalan ri chèile.

Mar roimhe, faodaidh an fheadhainn a tha mì-fhoighidneach sa bhad Rach don stòr ùraichte agus suathadh a h-uile càil le do làmhan fhèin.


Clàr-innse

  1. Roinn
  2. Conquer

Roinn

Is e a’ chiad rud a dh’ fheumas sinn a dhèanamh gus ar n-amas àrd a choileanadh a bhith a’ roinn am bathar-bog a leasaicheas sinn gu bhith na bhlocaichean uile-choitcheann, iomallach a tha èideadh bho shealladh an neach-cleachdaidh.

Anns a 'chiad phàirt, chaidh a leithid de bhloc àbhaisteach a mhìneachadh - pròiseact le leabharlann cinn. A-nis leig dhuinn leabharlann cruinnichte a chuir ris a’ phròiseact againn.

Gus seo a dhèanamh, leig dhuinn a-mach buileachadh a 'ghnìomh myfunc ann an leith .cpp-faidhle:

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

An uairsin bidh sinn a’ mìneachadh an leabharlann a thèid a chur ri chèile (myfeature), a bhios air a dhèanamh suas de na chaidh fhaighinn sa cheum roimhe .cpp-faidhle. Tha e soilleir gu bheil feum aig an leabharlann ùr air cinn-cinn a th’ ann mar-thà, agus gus seo a thoirt seachad, faodaidh agus bu chòir a bhith ceangailte ris an adhbhar a th’ ann. mylib. A bharrachd air an sin, tha an ceangal eatorra poblach, a tha a 'ciallachadh gum bi a h-uile càil ris a bheil an targaid ceangailte myfeature, gheibh e gu fèin-ghluasadach an luchd agus an targaid mylib (tuilleadh mu dhòighean fighe).

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

An ath rud, nì sinn cinnteach gu bheil an leabharlann ùr air a chuir a-steach air an t-siostam cuideachd:

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

Bu chòir a thoirt fa-near gur ann airson an adhbhar myfeature, mar airson mylib chaidh alias le ro-leasachan a chruthachadh Mylib::. Tha an aon rud air a sgrìobhadh airson an dà adhbhar nuair a thèid an às-mhalairt airson an stàladh air an t-siostam. Tha seo ga dhèanamh comasach obrachadh gu co-ionnan le amasan airson neach sam bith sgeama ceangail.

Às deidh seo, chan eil air fhàgail ach deuchainnean aonad a cheangal ris an leabharlann ùr (gnìomh myfunc air a thoirt a-mach às an tiotal, mar sin a-nis feumaidh tu ceangal):

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
 )

Cinn (Mylib::mylib) a-nis chan fheum thu ceangal a dhèanamh air leth, oir, mar a chaidh ainmeachadh roimhe, tha iad ceangailte gu fèin-ghluasadach còmhla ris an leabharlann (Mylib::myfeature).

Agus cuiridh sinn nuance no dhà ris gus dèanamh cinnteach à tomhas còmhdaich a’ toirt aire don leabharlann a tha air ùr thighinn:

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

Faodaidh tu barrachd leabharlannan, executables, msaa a chur ris. Chan eil e gu diofar dè dìreach a tha iad ceangailte ri chèile taobh a-staigh a’ phròiseict. Is e an aon rud cudromach dè na targaidean a tha mar eadar-aghaidh ar modal, is e sin, bidh iad a’ cumail a-mach.

Conquer

A-nis tha modalan bloc àbhaisteach againn, agus is urrainn dhuinn smachd a chumail orra: an cur ri chèile ann an structar iom-fhillteachd sam bith, gan stàladh ann an siostam no gan ceangal ri chèile taobh a-staigh aon shiostam cruinneachaidh.

Stàladh a-steach don t-siostam

Is e aon de na roghainnean airson am modal a chleachdadh am modal againn a chuir a-steach don t-siostam.

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

Às deidh sin, tha e ceangailte ri pròiseact sam bith eile a ’cleachdadh an àithne find_package.

find_package(Mylib 1.0 REQUIRED)

Ceangal mar fo-mhodal

Is e roghainn eile am pasgan leis a’ phròiseact againn a cheangal ri pròiseact eile mar fho-mhodal a’ cleachdadh an àithne add_subdirectory.

Cleachd

Tha na dòighean ceangail eadar-dhealaichte, ach tha an toradh mar an ceudna. Anns gach suidheachadh, bidh amasan rim faighinn sa phròiseact a’ cleachdadh ar modal Mylib::myfeature и Mylib::mylib, a dh'fhaodar a chleachdadh, mar eisimpleir, mar seo:

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

Gu sònraichte anns a 'chùis againn, an leabharlann Mylib::myfeature feumar ceangal a dhèanamh nuair a tha feum air ceangal ris an leabharlann libmyfeature. Ma tha cinn gu leòr ann, is fhiach an leabharlann a chleachdadh Mylib::mylib.

Faodaidh targaidean CMake a bhith duilich, mar eisimpleir, an dùil dìreach cuid de thogalaichean, eisimeileachd, msaa a chuir air adhart. Aig an aon àm, ag obair còmhla riutha a 'tachairt san aon dòigh.

Sin a dh'fheumadh sinn fhaighinn.

Source: www.habr.com

Cuir beachd ann