
Denne underholdende historien snakket om Ă„ organisere et header-bibliotek i CMake build-systemgeneratoren.
Denne gangen vil vi legge til et kompilert bibliotek til det, og ogsÄ snakke om Ä koble moduler med hverandre.
Som fÞr kan de som er utÄlmodige umiddelbart og ta pÄ alt med egne hender.
Innhold
Det fÞrste vi mÄ gjÞre for Ä nÄ vÄrt hÞye mÄl er Ä dele opp programvaren vi utvikler i universelle, isolerte blokker som er enhetlige fra brukerens synspunkt.
I den fÞrste delen ble en slik standardblokk beskrevet - et prosjekt med et overskriftsbibliotek. La oss nÄ legge til et kompilert bibliotek til prosjektet vÄrt.
For Ă„ gjĂžre dette, la oss ta ut implementeringen av funksjonen myfunc i 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
~ 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;
+ }
+}Deretter definerer vi biblioteket som skal kompileres (myfeature), som vil bestÄ av det som ble oppnÄdd i forrige trinn .cpp-fil. Det nye biblioteket krever Äpenbart eksisterende overskrifter, og for Ä kunne tilby dette kan og bÞr det knyttes til det eksisterende formÄlet mylib. Dessuten er forbindelsen mellom dem offentlig, noe som betyr at alt som mÄlet vil vÊre koblet til myfeature, vil automatisk motta lasten og mÄlet 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)
+###################################################################################################
+##
+## ĐĐŸĐŒĐżĐžĐ»ĐžŃŃĐ”ĐŒĐ°Ń Đ±ĐžĐ±Đ»ĐžĐŸŃĐ”Đșа
+##
+###################################################################################################
+
+add_library(myfeature src/mylib/myfeature.cpp)
+target_link_libraries(myfeature PUBLIC mylib)
+
+add_library(Mylib::myfeature ALIAS myfeature)
+Deretter skal vi sÞrge for at det nye biblioteket ogsÄ er installert pÄ 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 skal bemerkes at for formÄlet myfeature, nÄr det gjelder mylib et alias med et prefiks ble opprettet Mylib::. Det samme skrives for begge formÄl nÄr de eksporteres for installasjon pÄ systemet. Dette gjÞr det mulig Ä jobbe enhetlig med mÄl for evt .
Etter dette gjenstÄr det bare Ä koble enhetstester med det nye biblioteket (funksjon myfunc tatt ut av tittelen, sÄ nÄ mÄ du linke):
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
)Overskrifter (Mylib::mylib) nÄ trenger du ikke koble til separat, fordi, som allerede nevnt, kobles de automatisk sammen med biblioteket (Mylib::myfeature).
Og la oss legge til et par nyanser for Ä sikre dekningsmÄlinger som tar hensyn til det nylig ankomne biblioteket:
@@ -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
)Du kan legge til flere biblioteker, kjÞrbare filer osv. Det spiller ingen rolle hvor nÞyaktig de er knyttet til hverandre innenfor prosjektet. Det eneste viktige er hvilke mÄl som er grensesnittet til modulen vÄr, det vil si at de stikker seg ut.
NĂ„ har vi standard blokkmoduler, og vi kan dominere dem: komponere dem til en struktur av enhver kompleksitet, installere dem i et system eller koble dem sammen i et enkelt monteringssystem.
Installasjon i systemet
Et av alternativene for Ä bruke modulen er Ä installere vÄr modul i systemet.
cmake --build ĐżŃŃŃ/Đș/ŃĐ±ĐŸŃĐŸŃĐœĐŸĐč/ĐŽĐžŃĐ”ĐșŃĐŸŃОО --target installEtter det kobles den til et hvilket som helst annet prosjekt ved Ă„ bruke kommandoen .
find_package(Mylib 1.0 REQUIRED)Tilkobling som en undermodul
Et annet alternativ er Ä koble mappen med prosjektet vÄrt til et annet prosjekt som en undermodul ved Ä bruke kommandoen .
Bruk
Bindingsmetodene er forskjellige, men resultatet er det samme. I begge tilfeller vil mÄl vÊre tilgjengelige i prosjektet ved hjelp av vÄr modul Mylib::myfeature О Mylib::mylib, som kan brukes for eksempel slik:
add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)Spesielt i vÄrt tilfelle, biblioteket Mylib::myfeature mÄ kobles til nÄr det er nÞdvendig Ä koble til biblioteket libmyfeature. Hvis det er nok overskrifter, er det verdt Ä bruke biblioteket Mylib::mylib.
CMake-mÄl kan vÊre vanskelige, for eksempel kun ment Ä videresende enkelte egenskaper, avhengigheter osv. Samtidig skjer arbeidet med dem pÄ samme mÄte.
Det var det vi trengte Ä fÄ.
Kilde: www.habr.com
