ربما لا يحب أي منا الانتظار طويلاً حتى الانتهاء من تجميع المشروع ، عندما تكون كل ثانية مثل الأبدية. ومن الجيد إذا كانت ساعات العمل ، ويمكنك قضاء الوقت بكوب من القهوة ، ومناقشة جميع أوجه القصور في جمع القمامة التلقائي.
في بعض الأحيان ، يمكن تحقيق نجاح معين من خلال إجراء تحسين CMake. تعتمد التقنية المذكورة هنا على فكرة بسيطة: يمكن تجميع مكتبتين ثابتتين تستخدمان وظائف بعضهما البعض في وقت واحد.
القليل من التشريح
للبدء ، ضع في اعتبارك الخطوات الأساسية لبناء مكتبة ثابتة:
- المعالج المسبق - يزيل جميع التعليقات من ملفات المصدر ، ويدرج ملفات الرأس ويستبدل وحدات الماكرو بقيم محسوبة.
- المترجم - يحول الملفات التي يعالجها المعالج المسبق إلى كود المجمع.
- المجمع - يترجم رمز التجميع إلى رمز الآلة ؛ يتم حفظ النتيجة كملفات كائن.
- أرشيفي - يجمع ملفات الكائنات في أرشيف واحد.
بيانياً ، تظهر هذه الخطوات في الرسم البياني:
, . , . . , , .
, , CMake target_link_libraries. :
target_link_libraries(staticC PRIVATE staticB)
, — staticC staticB. , , , staticC, staticB.
, CoherentDeps, :
, staticC staticB, .
, , , ( , ) INTERFACE, -meta ( , ). , -, .
target_link_libraries .
, :
: NonCoherentDeps.
:
NonCoherentDeps.
staticB staticA, staticC staticB, NonCoherentDeps staticC. :
CMake- staticA - :
add_library(staticA-meta INTERFACE)
target_include_directories(staticA-meta INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}")
, :
target_link_libraries(staticA PUBLIC staticA-meta)
staticB CMake
target_link_libraries(staticB PRIVATE staticA)
:
target_link_libraries(staticB PRIVATE staticA-meta)
staticA staticB, . staticB staticA .
:
— :
add_executable(NonCoherentDeps main.cpp)
target_link_libraries(NonCoherentDeps PRIVATE staticC staticB staticA )
, .
, staticA, target_include_directories. NonCoherentDeps, :
target_include_directories(staticB PRIVATE "${path_to_headers_in_staticA}")
:
target_link_libraries(staticB PRIVATE staticA-meta)
, staticB staticA, staticC :
target_include_directories(staticC PRIVATE "${path_to_headers_in_staticB}" "${path_to_headers_in_staticA}")
. :
target_link_libraries(staticB-meta INTERFACE staticA-meta)
staticC :
target_link_libraries(staticC INTERFACE staticB-meta)
staticB, , .
أيضا في الحزمة الوصفية يمكنك إضافة تبعية في شكل أمر لإنشاء ملفات رأس ، والخصائص هي مسارات صحيحة.