اولین کاری که برای رسیدن به هدف والای خود باید انجام دهیم این است که نرم افزاری را که توسعه می دهیم به بلوک های جهانی و ایزوله تقسیم کنیم که از نظر کاربر یکنواخت هستند.
در قسمت اول، چنین بلوک استانداردی شرح داده شد - پروژه ای با کتابخانه هدر. حالا بیایید یک کتابخانه کامپایل شده به پروژه خود اضافه کنیم.
برای انجام این کار، اجازه دهید اجرای تابع را حذف کنیم 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 می توانند مشکل ساز باشند، به عنوان مثال، فقط برای ارسال برخی ویژگی ها، وابستگی ها و غیره در نظر گرفته شده اند. در عین حال، کار با آنها به همین ترتیب اتفاق می افتد.