سؤال

أتطلع إلى تجميع نسختين من BOOST في مشروع في نفس الوقت.ومن الناحية المثالية ينبغي أن تكون قابلة للاستخدام على هذا المنوال:

boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass();
boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic);
هل كانت مفيدة؟

المحلول

قرأت (ممسوحة ضوئيا جيدا) من خلال مناقشة قائمة التطوير.لا يوجد حل سهل.لتلخيص:

  1. التفاف ملفات الرأس في إعلان مساحة الاسم

    namespace boost_1_36_0 {
        #include <boost_1_36_0/boost/regex.hpp>
    }
    namespace boost_1_35_0 {
        #include <boost_1_35_0/boost/shared_ptr.hpp>
    }
    
    • يتطلب تعديل الملفات المصدر
    • لا يسمح بتضمين كلا الإصدارين في نفس وحدة الترجمة، نظرًا لأن وحدات الماكرو لا تحترم مساحات الأسماء.
  2. تحديد التعزيز قبل تضمين الرؤوس

    #define boost boost_1_36_0
        #include <boost_1_36_0/boost/regex.hpp>
    #undef boost
    #define boost boost_1_35_0
        #include <boost_1_35_0/boost/shared_ptr.hpp>
    #undef boost
    
    • يمكن ببساطة تجميع الملفات المصدرية باستخدام -Dboost=boost_1_36_0
    • لا يزال لا يعالج تعارضات الماكرو في وحدة ترجمة واحدة.
    • قد يتم إفساد بعض تضمينات ملف الرأس الداخلي، نظرًا لحدوث هذا النوع من الأشياء.

      #if defined(SOME_CONDITION)
      #  define HEADER <boost/some/header.hpp>
      #else
      #  define HEADER <boost/some/other/header.hpp>
      #endif
      

      ولكن قد يكون من السهل التغلب على هذه الحالات.

  3. تعديل مكتبة التعزيز بأكملها لاستبدالها namespace boost {..} مع namespace boost_1_36_0 {...} ومن ثم توفير اسم مستعار لمساحة الاسم.استبدال الكل BOOST_XYZ وحدات الماكرو واستخداماتها BOOST_1_36_0_XYZ وحدات الماكرو.
    • من المحتمل أن ينجح هذا إذا كنت على استعداد لبذل هذا الجهد.

نصائح أخرى

استخدام bcp يمكنهم تثبيت مكتبة التعزيز في موقع محدد ويمكنهم استبدال كل "تعزيز مساحة الاسم" في التعليمات البرمجية الخاصة بهم باسم مستعار مخصص.بافتراض أن الاسم المستعار الخاص بنا هو "boost_1_36_0"، فإن جميع مجموعات التعليمات البرمجية "تعزيز مساحة الاسم" ستبدأ بـ "boost_1_36_0".شيء مثل

bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install

, ، ولكن تحقق من الوثائق الموجودة في الرابط بنفسك لأنني لست متأكدًا مما إذا كانت صياغة قانونية أم لا.

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top