Потім визначимо бібліотеку, що компілюється (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-мети можуть бути хитрими, наприклад, призначеними тільки для того, щоб прокидати будь-які властивості, залежності і т.п. При цьому робота з ними відбувається єдиним чином.