
e kësaj historie interesante u fol për organizimin e bibliotekës së titujve brenda gjeneratorit të sistemeve të ndërtimit CMake.
Këtë herë do të shtojmë një bibliotekë të kompilueshme, dhe gjithashtu do të flasim për lidhjen e moduleve me njëri-tjetrin.
Siç ishte më parë, ata që mezi presin mund të dhe ta provojnë gjithçka me duar.
Përmbajtja
E para që duhet bërë për të arritur qëllimin tonë të lartë është të ndajmë softuerin që po zhvillohet në blloqe universale dhe të izoluar, njëlloj nga pikëpamja e përdoruesit.
NĂ« pjesĂ«n e parĂ« u pĂ«rshkrua njĂ« bllok standard i tillĂ« â projekti me bibliotekĂ« titujsh. Tani do tĂ« shtojmĂ« njĂ« bibliotekĂ« tĂ« kompilueshme nĂ« projektin tonĂ«.
Për këtë do të nxjerrim në pah implementimin e funksionit myfunc në një .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
+
+namespace mylib
+{
+ bool myfunc (mystruct)
+ {
+ return true;
+ }
+}Pastaj do të përcaktojmë bibliotekën e kompilueshme (myfeature), e cila do të përbëhet nga skedari i krijuar në hapin e mëparshëm .cpp-file. Biblioteka e re, sigurisht, kërkon që titujt ekzistues të jenë të pranishëm, dhe për ta bërë këtë, duhet dhe mund të lidhet me objektin ekzistues mylib. Pra, lidhja midis tyre është publike, që do të thotë se gjithçka që do të lidhet me objektin myfeature, automatikisht do të marrë përgjegjësinë dhe objektin mylib ().
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)
+###################################################################################################
+##
+## Biblioteca në kompilim
+##
+###################################################################################################
+
+add_library(myfeature src/mylib/myfeature.cpp)
+target_link_libraries(myfeature PUBLIC mylib)
+
+add_library(Mylib::myfeature ALIAS myfeature)
+Më pas do të bëjmë që biblioteka e re të instalohet gjithashtu në 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)Duhet të kushtohet vëmendje që për objektin myfeature, ashtu si për mylib u krijua një alias me prefiksin Mylib::. E njëjta gjë është e specifikuar për të dy objektet kur eksportohen për t'u instaluar në sistem. Kjo lejon një trajtim të njëtrajtshëm me objektet gjatë çdo .
Pas kësaj mbetet të lidhim testet modulore me bibliotekën e re (funksioni myfunc u largua nga titulli, kështu që tani duhet të lidhim):
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
)Koka (Mylib::mylib) tani nuk është e nevojshme të lidhni veçmas, sepse, siç është thënë më parë, ato lidhen automatikisht me bibliotekën (Mylib::myfeature).
Dhe do të shtojmë disa detaje për të siguruar matjet e mbulesës duke marrë parasysh bibliotekën e sapo ardhur:
@@ -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
)Mund të shtoni biblioteka të tjera, skedarë ekzekutivë, etj. Në këtë rast nuk ka rëndësi se si janë lidhur ato mes tyre brenda projektit. E rëndësishme është vetëm se cilat qëllime janë ndërfaqja e modulit tonë, domethënë, ato dalin jashtë.
Tani kemi module standard dhe mund të menaxhojmë ato: të ndërtojmë struktura të çdo kompleksiteti, duke i instaluar në sistem ose duke i lidhur bashkë brenda një sistemi ndërtimi.
Instalimi në sistem
Një nga opsionet për të përdorur modul është të instalohet moduli jonë në sistem.
cmake --build rruga/te/drejta/e/ndertimit --target installPas kësaj, ai lidhët me çdo projekt tjetër me komandën .
find_package(Mylib 1.0 REQUIRED)Kërcimi si një nënmodul
Një opsion tjetër është të lidhni dosjen e projektit tonë me një projekt tjetër si një nënmodul duke përdorur komandën .
Përdorimi
Metodat e lidhjes janë të ndryshme, por rezultati është i njëjtë. Në të dy rastet, në projektin që përdor modulin tonë, do të jenë të disponueshme qëllimet Mylib::myfeature dhe Mylib::mylib, të cilat mund të përdoren, për shembull, kështu:
add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)Specifikisht në rastin tonë, biblioteka Mylib::myfeature duhet të lidhet kur është nevoja për të lidhur me bibliotekën libmyfeature. Nëse mjaftojnë titujt, atëherë duhet të përdoret biblioteka Mylib::mylib.
Qëllimet CMake mund të jenë të ndërlikuara, për shembull, vetëm për të kaluar ndonjë vetësi, varësi etj. Megjithatë, puna me to bëhet në mënyrë të njëjtë.
ĂfarĂ« ishte e nevojshme pĂ«r t'u marrĂ«.
Burimi: habr.com
