Першае, што трэба зрабіць для дасягнення нашай высокай мэты - гэта падзяліць распрацоўванае ПЗ на ўніверсальныя ізаляваныя блокі, аднастайныя з пункту гледжання карыстальніка.
У першай частцы быў апісаны такі стандартны блок - праект з загалоўкавых бібліятэкай. Цяпер жа дададзім у наш праект кампіляваную бібліятэку.
Для гэтага вынесем рэалізацыю функцыі myfunc у асобны .cpp-файл:
Затым вызначым кампіляваную бібліятэку (myfeature), якая будзе складацца з атрыманага на папярэднім кроку .cpp-файла. Новай бібліятэцы, відавочна, патрабуюцца ўжо наяўныя загалоўкі, і для таго, каб гэта забяспечыць, можна і трэба правязаць яе з наяўнай мэтай mylib. Прычым правязка паміж імі публічная, а гэта значыць, што ўсё, да чаго будзе падключана мэта myfeature, аўтаматычна атрымае ў нагрузку і мэта 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)
+
Далей зробім, каб новая бібліятэка таксама ўсталёўвалася ў сістэму:
Трэба звярнуць увагу, што для мэты myfeature, як і для mylib быў заведзены псеўданім з прэфіксам Mylib::. Тое ж самае прапісана для абедзвюх мэт пры экспартаванні іх для ўстаноўкі ў сістэму. Гэта дае магчымасць аднастайнай працы з мэтамі пры любой схеме звязвання.
Пасля гэтага засталося правязаць модульныя тэсты з новай бібліятэкай (функцыю myfunc вынеслі з загалоўка, так што зараз трэба лінкавацца):
Загалоўкі (Mylib::mylib) зараз асобна падключаць не трэба, таму што, як ужо было сказана, яны аўтаматычна падключаюцца разам з бібліятэкай (Mylib::myfeature).
І дадамо пару нюансаў, каб забяспечыць замеры пакрыцця з улікам новай бібліятэкі:
Можна дадаць больш бібліятэк, выкананыя файлы і т.д. Пры гэтым не важна, як менавіта яны правязаны паміж сабой у рамках праекта. Важна толькі тое, якія мэты з'яўляюцца інтэрфейсам нашага модуля, гэта значыць тырчаць вонкі.
Цяпер у нас ёсць стандартныя модулі-блокі, і мы можам панаваць над імі: складаць з іх структуру любой складанасці, усталёўваючы іх у сістэму або звязваючы паміж сабой у рамках адзінай сістэмы зборкі.
Ўстаноўка ў сістэму
Адзін з варыянтаў выкарыстання модуля - усталяваць наш модуль у сістэму.
Пасля гэтага ён падключаецца ў любы іншы праект з дапамогай каманды find_package.
find_package(Mylib 1.0 REQUIRED)
Падключэнне ў якасці падмодуля
Іншы варыянт - падлучэнне тэчкі з нашым праектам да іншага праекту ў якасці падмодуля з дапамогай каманды add_subdirectory.
Выкарыстанне
Спосабы звязвання розныя, але вынік адзін і той жа. І ў адным, і ў іншым выпадку ў праекце, які выкарыстоўвае наш модуль, будуць даступныя мэты Mylib::myfeature и Mylib::mylib, якія могуць выкарыстоўвацца, напрыклад, так:
Канкрэтна ў нашым выпадку бібліятэку Mylib::myfeature трэба падключаць тады, калі неабходна злінкавацца з бібліятэкай libmyfeature. Калі дастаткова загалоўкаў, то тады варта выкарыстоўваць бібліятэку Mylib::mylib.
CMake-мэты могуць быць хітрымі, напрыклад, прызначанымі толькі для таго, каб пракідваць якія-небудзь уласцівасці, залежнасці і да т.п. Пры гэтым праца з імі адбываецца адзіным чынам.