C ++ lan CMake - sedulur ing salawas-lawase, part II

C ++ lan CMake - sedulur ing salawas-lawase, part II

Ing bagean sadurunge Crita sing nyenengake iki ngomong babagan ngatur perpustakaan header ing generator sistem mbangun CMake.

Wektu iki kita bakal nambah perpustakaan kompilasi, lan uga ngomong babagan ngubungake modul karo saben liyane.

Kaya sadurunge, sing ora sabar bisa langsung pindhah menyang gudang sing dianyari lan tutul kabeh nganggo tangan sampeyan dhewe.


Isi

  1. dibagi
  2. nelukake

dibagi

Babagan pisanan sing kudu ditindakake kanggo nggayuh tujuan sing dhuwur yaiku mbagi piranti lunak sing dikembangake dadi blok universal sing terisolasi sing seragam saka sudut pandang pangguna.

Ing bagean pisanan, pemblokiran standar kasebut diterangake - proyek kanthi perpustakaan header. Saiki ayo nambah perpustakaan sing dikompilasi menyang proyek kita.

Kanggo nindakake iki, ayo njupuk implementasine saka fungsi kasebut myfunc ing kapisah .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;
+    }
+}

Banjur kita nemtokake perpustakaan sing bakal dikompilasi (myfeature), sing bakal kalebu apa sing dipikolehi ing langkah sadurunge .cpp-file. Pustaka anyar temenan mbutuhake header sing wis ana, lan kanggo nyedhiyakake iki, bisa lan kudu diikat karo tujuan sing wis ana. mylib. Kajaba iku, sambungan antarane wong-wong mau umum, sing tegese kabeh sing bakal disambungake target myfeature, kanthi otomatis bakal nampa beban lan target mylib (liyane babagan cara nyulam).

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

Sabanjure, kita bakal nggawe manawa perpustakaan anyar uga diinstal ing sistem:

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

Perlu dicathet yen kanggo tujuan kasebut myfeature, minangka kanggo mylib alias digawe ater-ater Mylib::. Padha ditulis kanggo tujuan loro nalika ngekspor kanggo instalasi ing sistem. Iki ndadekake iku bisa kanggo bisa seragam karo gol kanggo sembarang skema ngiket.

Sawise iki, sing isih ana yaiku nyambungake tes unit karo perpustakaan anyar (function myfunc dijupuk saka judhul, dadi saiki sampeyan kudu ngubungake):

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
 )

Judul (Mylib::mylib) saiki sampeyan ora perlu nyambungake kanthi kapisah, amarga, kaya sing wis kasebut, disambungake kanthi otomatis bebarengan karo perpustakaan (Mylib::myfeature).

Lan ayo nambah sawetara nuansa kanggo njamin pangukuran jangkoan kanthi nimbang perpustakaan sing mentas teka:

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

Sampeyan bisa nambah luwih akeh perpustakaan, eksekusi, lsp. Ora Matter carane persis padha disambungake kanggo saben liyane ing project. Sing penting yaiku target sing dadi antarmuka modul kita, yaiku, tetep metu.

nelukake

Saiki kita duwe modul pemblokiran standar, lan kita bisa dominasi: nyipta menyang struktur apa wae kerumitan, nginstal menyang sistem utawa ngubungake ing siji sistem perakitan.

Instalasi menyang sistem

Salah siji opsi kanggo nggunakake modul yaiku nginstal modul kita menyang sistem.

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

Sawise iku, disambungake menyang proyek liyane nggunakake printah find_package.

find_package(Mylib 1.0 REQUIRED)

Sambungan minangka submodul

Pilihan liyane yaiku nyambungake folder kasebut karo proyek kita menyang proyek liyane minangka submodul nggunakake perintah kasebut add_subdirectory.

Gunakake

Cara naleni beda-beda, nanging asile padha. Ing kasus loro, gol bakal kasedhiya ing proyek nggunakake modul kita Mylib::myfeature ΠΈ Mylib::mylib, sing bisa digunakake, contone, kaya iki:

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

Khusus ing kasus kita, perpustakaan Mylib::myfeature kudu disambungake yen perlu kanggo nyambungake karo perpustakaan libmyfeature. Yen ana cukup header, iku worth nggunakake perpustakaan Mylib::mylib.

Target CMake bisa angel, contone, mung kanggo nerusake sawetara properti, dependensi, lsp. Ing wektu sing padha, nggarap wong-wong mau kedadeyan kanthi cara sing padha.

Sing perlu kita entuk.

Source: www.habr.com

Add a comment