Tinyxml2: CMake بناء ثابت مقابل libs المشتركة

تم إنشاؤها على ٢١ يوليو ٢٠١٧  ·  5تعليقات  ·  مصدر: leethomason/tinyxml2

لقد رأيت أن CMake build مدعوم الآن ويصدر أهدافه بتكوين ، وهو أمر رائع.
ومع ذلك ، أنا في حيرة من أمري فيما يتعلق بكيفية التعامل مع libs ثابت مقابل ديناميكي.

من وجهة نظري ، باستخدام إصدار CMake ، يمكنك تحديد BUILD_SHARED_LIBS=ON أو BUILD_SHARED_LIBS=OFF وسيتم إنشاء مكتبتك وفقًا لذلك. ومع ذلك ، يسمح التكوين الخاص بك بإنشاء كليهما ، ولكنه يصدرهما بأسماء مختلفة ( tinyxml2 مقابل tinyxml2_static ).

أقوم أيضًا بتطوير مكتبة تستخدم tinyxml2 ، ولكن في ملفات CMakeLists.txt الخاصة بي ، لا أريد أن أهتم بما إذا كان شخص ما قد قام بتثبيت الإصدار الثابت أو غير الثابت من tinyxml2.
يجب أن أفعل شيئًا مثل

find_package(tinyxml2 REQUIRED)
if (TARGET tinyxml2)
target_link_libraries(my_lib PRIVATE tinyxml2)
else()
target_link_libraries(my_lib PRIVATE tinyxml2_static)
endif()

إذن ، هذا ليس خطأ أو أي شيء ، لكني أتساءل فقط إذا كنت ترغب في إعادة النظر في هذا التصميم.

على ملاحظة جانبية ، اختارت العديد من المكتبات تصدير مكتباتها إلى مساحة اسم ، على سبيل المثال
سيتم الإشارة إلى export(EXPORT tinyxml2 NAMESPACE tinyxml2) لاحقًا كـ tinyxml2::tinyxml2 . أعتقد أن tinyxml2 تحتوي على مكون واحد فقط ، وهذا ليس ضروريًا تمامًا ، ولكن قد يكون مفيدًا في رؤية أنك تشير إلى مكتبة مثبتة.

التعليق الأكثر فائدة

يمكنك الحصول على كلاهما في الواقع.

add_library (tinyxml2 :: tinyxml2 ALIAS tinyxml2)

FWIW: نعم! الرجاء إضافة مساحة الاسم. هذا حاليا غير اصطلاحي. إليك أيضًا بعض الأسباب:

  • مع أهداف مساحة الاسم مثل Foo :: Foo ، إذا كانت مفقودة ، فسيعطيك التكوين خطأً بدلاً من مجرد إضافة -lFoo بصمت
  • تعد مساحة الاسم طريقة لطيفة لمعرفة متى يتم استيراد مكتبة مقابل جزء من المشروع ، حيث يتبع معظم الأشخاص هذا المعيار للأهداف المستوردة.

ال 5 كومينتر

ربما ينبغي أن أشارك أكثر في جميع خيارات البناء أكثر مما أنا عليه ، وآمل أن يتمكن شخص آخر من المساهمة بإجابة. لكن آمل دائمًا أن يعمل تضمين المصدر.

KerstinKeller يعد استخدام مساحة الاسم للتصدير بالتأكيد الأسلوب الحديث ولكنه قد يكسر جميع الإنشاءات الحالية. هل تخطط لتقديم PR لهذا الغرض؟

leethomason يمكنني القيام بذلك في وقت لاحق إذا كنت لا تمانع في مطالبة كل شخص يستخدم tinyxml2 بتغيير رابط الهدف إلى tinyxml2 :: tinyxml2 من رابط الهدف إلى tinyxml2 في قوائم CMakeLists الخاصة بهم.

يمكنك الحصول على كلاهما في الواقع.

add_library (tinyxml2 :: tinyxml2 ALIAS tinyxml2)

FWIW: نعم! الرجاء إضافة مساحة الاسم. هذا حاليا غير اصطلاحي. إليك أيضًا بعض الأسباب:

  • مع أهداف مساحة الاسم مثل Foo :: Foo ، إذا كانت مفقودة ، فسيعطيك التكوين خطأً بدلاً من مجرد إضافة -lFoo بصمت
  • تعد مساحة الاسم طريقة لطيفة لمعرفة متى يتم استيراد مكتبة مقابل جزء من المشروع ، حيث يتبع معظم الأشخاص هذا المعيار للأهداف المستوردة.

هل سيكون طلب السحب هذا المخصص في الأصل لمدير الحزم من Hunter موضع اهتمام؟ https://github.com/hunter-packages/tinyxml2/pull/2

يقوم بشكل أساسي بما تقترحه (+ يقدم CMakePackageConfigHelpers لإنشاء ملف التكوين). لم يكن لدي الوقت لتقديمه هنا لأنني كنت أعمل على أشياء أخرى.

يمكن تطبيقها إلى حد كبير خارج منطقة الجزاء مع الحد الأدنى من التعديلات.

بالطبع لن تتمكن مشاريع المصب من استخدام tinyxml2_static .

lsolanka تبدو حزم العلاقات العامة رقم 2 رائعة بالنسبة لي أيضًا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

leethomason picture leethomason  ·  4تعليقات

ajtruckle picture ajtruckle  ·  9تعليقات

MortenMacFly picture MortenMacFly  ·  18تعليقات

kurylo picture kurylo  ·  5تعليقات

vigneshrams picture vigneshrams  ·  3تعليقات