كيف يمكنني تغليف BOOST في مساحة اسم منفصلة؟
-
02-07-2019 - |
سؤال
أتطلع إلى تجميع نسختين من 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);
المحلول
قرأت (ممسوحة ضوئيا جيدا) من خلال مناقشة قائمة التطوير.لا يوجد حل سهل.لتلخيص:
التفاف ملفات الرأس في إعلان مساحة الاسم
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> }
- يتطلب تعديل الملفات المصدر
- لا يسمح بتضمين كلا الإصدارين في نفس وحدة الترجمة، نظرًا لأن وحدات الماكرو لا تحترم مساحات الأسماء.
تحديد التعزيز قبل تضمين الرؤوس
#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
ولكن قد يكون من السهل التغلب على هذه الحالات.
- يمكن ببساطة تجميع الملفات المصدرية باستخدام
- تعديل مكتبة التعزيز بأكملها لاستبدالها
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
لتجنب تعارض التعريفات.لقد كان كابوسًا لأسباب تتعلق بقابلية التشغيل البيني للنظام الأساسي نظرًا لأن تغيير الاسم يعمل بشكل مختلف تمامًا حتى في الإصدارات المختلفة من نفس المترجمين (في حالتي، دول مجلس التعاون الخليجي).
سيكون لديك عالم من المتاعب في الارتباط لأن الأسماء المشوهة ستكون مختلفة.ونعم، أرى أنك تعرف ذلك، ولكن يبدو أنه ستكون هناك مشكلة في كل مكان.