
Den hÀr underhÄllande historien talade om att organisera ett rubrikbibliotek inom CMake build-systemgeneratorn.
Den hÀr gÄngen kommer vi att lÀgga till ett sammanstÀllt bibliotek till det, och Àven prata om att lÀnka moduler med varandra.
Som tidigare kan den som Àr otÄlig direkt och rör allt med dina egna hÀnder.
InnehÄll
Det första vi behöver göra för att uppnÄ vÄrt höga mÄl Àr att dela upp mjukvaran vi utvecklar i universella, isolerade block som Àr enhetliga ur anvÀndarens synvinkel.
I den första delen beskrevs ett sÄdant standardblock - ett projekt med ett header-bibliotek. LÄt oss nu lÀgga till ett kompilerat bibliotek till vÄrt projekt.
För att göra detta, lÄt oss ta bort implementeringen av funktionen 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;
+ }
+}Sedan definierar vi biblioteket som ska kompileras (myfeature), som kommer att bestÄ av det som erhölls i föregÄende steg .cpp-fil. Det nya biblioteket krÀver uppenbarligen befintliga rubriker, och för att tillhandahÄlla detta kan och bör det kopplas till det befintliga syftet mylib. Dessutom Àr kopplingen mellan dem offentlig, vilket innebÀr att allt som mÄlet kommer att kopplas till myfeature, kommer automatiskt att ta emot belastningen och 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)
+DÀrefter ser vi till att det nya biblioteket ocksÄ Àr installerat 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 bör noteras att för ÀndamÄlet myfeature, som för mylib ett alias med ett prefix skapades Mylib::. Detsamma skrivs för bÄda ÀndamÄlen nÀr man exporterar dem för installation pÄ systemet. Detta gör det möjligt att arbeta enhetligt med mÄl för eventuella .
Efter detta ÄterstÄr bara att koppla enhetstester med det nya biblioteket (funktion myfunc tagits ur titeln, sÄ nu mÄste du lÀnka):
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
)Rubriker (Mylib::mylib) nu behöver du inte ansluta separat, eftersom de, som redan nÀmnts, ansluts automatiskt tillsammans med biblioteket (Mylib::myfeature).
Och lÄt oss lÀgga till ett par nyanser för att sÀkerstÀlla tÀckningsmÀtningar med hÀnsyn till det nyinkomna 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 lÀgga till fler bibliotek, körbara filer etc. Det spelar ingen roll hur exakt de Àr kopplade till varandra inom projektet. Det enda viktiga Àr vilka mÄl som Àr grÀnssnittet i vÄr modul, det vill sÀga de sticker ut.
Nu har vi standardblockmoduler, och vi kan dominera dem: komponera dem till en struktur av vilken komplexitet som helst, installera dem i ett system eller lÀnka ihop dem i ett enda monteringssystem.
Installation i systemet
Ett av alternativen för att anvÀnda modulen Àr att installera vÄr modul i systemet.
cmake --build ĐżŃŃŃ/Đș/ŃĐ±ĐŸŃĐŸŃĐœĐŸĐč/ĐŽĐžŃĐ”ĐșŃĐŸŃОО --target installEfter det kopplas den till vilket annat projekt som helst med kommandot .
find_package(Mylib 1.0 REQUIRED)Anslutning som undermodul
Ett annat alternativ Àr att koppla mappen med vÄrt projekt till ett annat projekt som en undermodul med kommandot .
AnvÀnd
Bindningsmetoderna Àr olika, men resultatet Àr detsamma. I bÄda fallen kommer mÄl att vara tillgÀngliga i projektet med hjÀlp av vÄr modul Mylib::myfeature О Mylib::mylib, som till exempel kan anvÀndas sÄ hÀr:
add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)NÀrmare bestÀmt i vÄrt fall, biblioteket Mylib::myfeature mÄste anslutas nÀr det Àr nödvÀndigt att lÀnka till biblioteket libmyfeature. Om det finns tillrÀckligt med rubriker Àr det vÀrt att anvÀnda biblioteket Mylib::mylib.
CMake-mÄl kan vara knepiga, till exempel avsedda att endast vidarebefordra vissa egenskaper, beroenden, etc. Samtidigt sker arbetet med dem pÄ samma sÀtt.
Det var vad vi behövde fÄ.
KĂ€lla: will.com
