
Tinalakay ng nakakaaliw na kuwentong ito ang organisasyon ng header library sa loob ng generator ng CMake build system.
Sa pagkakataong ito, magdaragdag kami ng pinagsama-samang library dito, at pag-uusapan din ang tungkol sa pag-uugnay ng mga module nang magkasama.
Gaya ng dati, pwede agad ang mga naiinip at hawakan ang lahat gamit ang iyong sariling mga kamay.
nilalaman
Ang unang bagay na kailangan naming gawin upang makamit ang aming matayog na layunin ay hatiin ang software na binuo sa unibersal, hiwalay na mga bloke na pare-pareho mula sa pananaw ng user.
Sa unang bahagi, inilarawan namin ang isang karaniwang bloke ng proyekto—isang proyekto na may isang library ng header. Ngayon, magdagdag tayo ng pinagsama-samang aklatan sa ating proyekto.
Upang gawin ito, aalisin namin ang pagpapatupad ng function myfunc sa isang hiwalay .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;
+ }
+}Pagkatapos ay tinukoy namin ang pinagsama-samang aklatan (myfeature), na bubuo ng kung ano ang nakuha sa nakaraang hakbang .cpp-file. Ang bagong library ay malinaw na nangangailangan ng mga umiiral na header, at upang matiyak ito, maaari at dapat itong maiugnay sa umiiral na target mylib. Bukod dito, ang koneksyon sa pagitan ng mga ito ay pampubliko, na nangangahulugan na ang lahat ng bagay na kung saan ang target ay konektado myfeature, ay awtomatikong makakatanggap ng target bilang bonus 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)
+Susunod, titiyakin namin na ang bagong library ay naka-install din sa system:
@@ -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)Dapat pansinin na para sa layunin myfeature, para sa mylib isang pseudonym na may prefix ay nilikha Mylib::Ang parehong ay inireseta para sa parehong mga target kapag ine-export ang mga ito para sa pag-install sa system. Nagbibigay-daan ito para sa pare-parehong trabaho sa mga target anuman ang .
Pagkatapos nito, ang natitira na lang ay i-link ang mga unit test sa bagong library (function myfunc inalis mula sa pamagat, kaya ngayon kailangan mong mag-link):
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
)Mga Ulo ng Balita (Mylib::mylib) ngayon hindi mo na kailangang ikonekta ang mga ito nang hiwalay, dahil, tulad ng nabanggit na, awtomatiko silang konektado kasama ng library (Mylib::myfeature).
At magdagdag tayo ng ilang mga nuances upang matiyak na isinasaalang-alang ng mga sukat ng saklaw ang bagong dating na library:
@@ -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
)Maaari kang magdagdag ng higit pang mga library, executable, at iba pa. Hindi mahalaga kung gaano sila magkakaugnay sa loob ng proyekto. Ang mahalaga ay kung aling mga target ang interface ng aming module, ibig sabihin ay nalantad ang mga ito.
Ngayon ay mayroon na kaming mga karaniwang module-block, at maaari naming dominahin ang mga ito: maaari kaming bumuo ng isang istraktura ng anumang kumplikado mula sa mga ito, i-install ang mga ito sa system o i-link ang mga ito nang magkasama sa loob ng isang sistema ng pagpupulong.
Pag-install sa system
Isa sa mga opsyon sa paggamit ng module ay ang pag-install ng aming module sa system.
cmake --build путь/к/сборочной/директории --target installPagkatapos nito, ito ay konektado sa anumang iba pang proyekto gamit ang command .
find_package(Mylib 1.0 REQUIRED)Koneksyon bilang isang submodule
Ang isa pang pagpipilian ay upang ikonekta ang folder sa aming proyekto sa isa pang proyekto bilang isang submodule gamit ang command .
Gamitin
Iba-iba ang mga paraan ng pag-uugnay, ngunit pareho ang resulta. Sa parehong mga kaso, ang mga target ay magagamit sa proyekto gamit ang aming module. Mylib::myfeature и Mylib::mylib, na maaaring gamitin, halimbawa, tulad nito:
add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)Partikular sa aming kaso, ang library Mylib::myfeature Kailangan itong konektado kapag kinakailangan na mag-link sa library libmyfeatureKung may sapat na mga header, sulit na gumamit ng library. Mylib::mylib.
Ang mga target ng CMake ay maaaring nakakalito, halimbawa, na idinisenyo lamang upang pumasa sa ilang partikular na katangian, dependency, atbp. Gayunpaman, ang lahat ng ito ay pinangangasiwaan sa isang pare-parehong paraan.
Na kung ano ang inaasahan na makamit.
Pinagmulan: www.habr.com
