Првото нешто што треба да направиме за да ја постигнеме нашата возвишена цел е да го поделиме софтверот што го развиваме на универзални, изолирани блокови кои се униформни од гледна точка на корисникот.
Во првиот дел, беше опишан таков стандарден блок - проект со библиотека за заглавија. Сега да додадеме компајлирана библиотека на нашиот проект.
За да го направите ова, ајде да ја извадиме имплементацијата на функцијата 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 може да бидат незгодни, на пример, наменети само за проследување на некои својства, зависности итн. Во исто време, работата со нив се случува на ист начин.