
af denne interessante fortælling blev der talt om organisationen af headerbiblioteket inden for CMake build-systemgeneratoren.
Denne gang tilføjer vi en kompilérbar bibliotekt, og vi vil også tale om, hvordan modulerne kan sammenkobles.
Som tidligere kan de, der ikke kan vente, straks og prøve alt selv.
Indhold
Det første, vi skal gøre for at nå vores høje mål, er at dele den udviklede software op i universelle isolerede blokke, der er ensartede set fra brugerens perspektiv.
I første del blev en sådan standardblok beskrevet – et projekt med et headerbibliotek. Nu tilføjer vi en kompilérbar bibliotekt til vores projekt.
For dette vil vi udtrække implementeringen af funktionen myfunc til en separat .cpp-fil:
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
~ se 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;
+ }
+}Derefter definerer vi den kompilérbare bibliotekt (myfeature), som vil bestå af den fil, vi fik fra det forrige trin. Den nye bibliotekt kræver åbenlyst de eksisterende headers, og for at sikre dette kan vi og skal vi binde den til den eksisterende mål .cppmylib . Desuden er bindingen mellem dem offentlig, hvilket betyder, at alt, der tilsluttes målet, automatisk vil modtage mållæs mere om bindingsmetoder myfeaturediff --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)+################################################################################################### +## +## Kompilérbar bibliotekt +## +################################################################################################### + +add_library(myfeature src/mylib/myfeature.cpp) +target_link_libraries(myfeature PUBLIC mylib) + +add_library(Mylib::myfeature ALIAS myfeature) + . Desuden er bindingen mellem dem offentlig, hvilket betyder, at alt, der tilsluttes målet, automatisk vil modtage mål ().
@@ -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)Lad os nu sørge for, at det nye bibliotek også bliver installeret i systemet:
@@ -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)Det er vigtigt at bemærke, at for formålet myfeature, ligesom for . Desuden er bindingen mellem dem offentlig, hvilket betyder, at alt, der tilsluttes målet, automatisk vil modtage mål blev der oprettet et alias med præfikset Mylib::. Det samme er angivet for begge mål, når de eksporteres til installation i systemet. Dette giver mulighed for ensartet arbejde med målene uanset hvilken .
Efter dette er det blot at tilknytte modulære tests med det nye bibliotek (funktionen myfunc blev fjernet fra headeren, så nu skal der linkes):
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
)Headers (Mylib::mylib) behøver nu ikke længere at blive inkluderet separat, fordi, som allerede nævnt, de automatisk inkluderes sammen med biblioteket (Mylib::myfeature).
Og vi tilføjer et par nuancer for at sikre måling af dækning med det nyankommende bibliotek:
@@ -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
)Man kan tilføje flere biblioteker, eksekverbare filer osv. Det er ligegyldigt, hvordan de er forbundet med hinanden i projektet. Det vigtigste er, hvilke mål der er interface til vores modul, det vil sige hvad der er synligt udadtil.
Nu har vi standardmoduler, og vi kan kontrollere dem: sammensætte dem til enhver kompleks struktur, installere dem i systemet eller linke dem sammen inden for et enkelt bygge system.
Installation i systemet
En af måderne at bruge modulet på er at installere vores modul i systemet.
cmake --build sti/til/bygge/directory --target installDerefter tilsluttes det i ethvert andet projekt med kommandoen .
find_package(Mylib 1.0 REQUIRED)Tilslutning som undermodul
En anden mulighed er at tilslutte mappen med vores projekt til et andet projekt som et undermodul ved hjælp af kommandoen .
Brugen af
Metoderne til at binde er forskellige, men resultatet er det samme. I begge tilfælde vil målene være tilgængelige i projektet, der bruger vores modul. Mylib::myfeature og Mylib::mylib, som kan anvendes, for eksempel sådan her:
add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)Specifikt i vores tilfælde skal biblioteket Mylib::myfeature tilsluttes, når det er nødvendigt at linke til biblioteket libmyfeature.Hvis det kun er overskrifterne, der er tilstrækkelige, så bør man bruge biblioteket. Mylib::mylib.
CMake-mål kan være listige, for eksempel kun beregnet på at overføre visse egenskaber, afhængigheder og lignende. Arbejdet med dem foregår ensartet.
Som det var ønsket.
Kilde: habr.com
