Bizning yuksak maqsadimizga erishishimiz kerak bo'lgan birinchi narsa, biz ishlab chiqayotgan dasturiy ta'minotni foydalanuvchi nuqtai nazaridan bir xil bo'lgan universal, izolyatsiya qilingan bloklarga bo'lishdir.
Birinchi qismda bunday standart blok tasvirlangan - sarlavha kutubxonasi bo'lgan loyiha. Endi loyihamizga kompilyatsiya qilingan kutubxonani qo'shamiz.
Buning uchun funktsiyani amalga oshirishni chiqaramiz myfunc alohida holatda .cpp-fayl:
Keyin biz kompilyatsiya qilinadigan kutubxonani aniqlaymiz (myfeature), oldingi bosqichda olingan narsalardan iborat bo'ladi .cpp-fayl. Yangi kutubxona, shubhasiz, mavjud sarlavhalarni talab qiladi va buni ta'minlash uchun u mavjud maqsadga bog'lanishi mumkin va kerak. mylib. Bundan tashqari, ular orasidagi aloqa ommaviydir, ya'ni maqsad bog'langan hamma narsa myfeature, yuk va maqsadni avtomatik ravishda oladi mylib (trikotaj usullari haqida ko'proq).
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)
+
Keyinchalik, yangi kutubxona tizimda o'rnatilganligiga ishonch hosil qilamiz:
Shuni ta'kidlash kerakki, maqsadda myfeature, kelsak mylib prefiksli taxallus yaratildi Mylib::. Ularni tizimga o'rnatish uchun eksport qilishda ikkala maqsad uchun ham xuddi shunday yoziladi. Bu har qanday maqsadlar bilan bir xilda ishlashga imkon beradi bog'lash sxemasi.
Shundan so'ng, birlik testlarini yangi kutubxona bilan bog'lash qoladi (funktsiya myfunc sarlavhadan olib tashlangan, shuning uchun endi siz havola qilishingiz kerak):
Sarlavhalar (Mylib::mylib) endi siz alohida ulanishingiz shart emas, chunki yuqorida aytib o'tilganidek, ular kutubxona bilan birga avtomatik ravishda ulanadi (Mylib::myfeature).
Keling, yangi kelgan kutubxonani hisobga olgan holda qamrov o'lchovlarini ta'minlash uchun bir nechta nuanslarni qo'shamiz:
Siz ko'proq kutubxonalar, bajariladigan fayllar va boshqalarni qo'shishingiz mumkin. Loyiha doirasida ular bir-biriga qanchalik aniq bog'langanligi muhim emas. Eng muhimi, qaysi maqsadlar modulimizning interfeysi, ya'ni ular ajralib turadi.
Endi bizda standart blok modullari bor va biz ularni boshqarishimiz mumkin: ularni har qanday murakkablikdagi tuzilmaga aylantiramiz, ularni tizimga o'rnatamiz yoki bitta yig'ish tizimida bir-biriga bog'laymiz.
Tizimga o'rnatish
Moduldan foydalanish variantlaridan biri bizning modulimizni tizimga o'rnatishdir.
Shundan so'ng, u buyruq yordamida boshqa har qanday loyihaga ulanadi find_package.
find_package(Mylib 1.0 REQUIRED)
Submodul sifatida ulanish
Boshqa variant - bu buyruq yordamida papkani loyihamiz bilan boshqa loyihaga submodul sifatida ulash add_subdirectory.
foydalanish
Bog'lash usullari boshqacha, ammo natija bir xil. Ikkala holatda ham, bizning modulimiz yordamida loyihada maqsadlar mavjud bo'ladi Mylib::myfeature ΠΈ Mylib::mylib, masalan, quyidagi kabi ishlatilishi mumkin:
Xususan, bizning holatimizda kutubxona Mylib::myfeature kutubxona bilan bog'lanish zarur bo'lganda ulanish kerak libmyfeature. Agar sarlavhalar etarli bo'lsa, kutubxonadan foydalanishga arziydi Mylib::mylib.
CMake maqsadlari qiyin bo'lishi mumkin, masalan, faqat ba'zi xususiyatlar, bog'liqliklar va hokazolarni yuborish uchun mo'ljallangan. Shu bilan birga, ular bilan ishlash xuddi shu tarzda sodir bo'ladi.