2013-02-11 66 views
8

मैं एक साझा लाइब्रेरी (सी ++) और एक पाइथन मॉड्यूल वितरित कर रहा हूं जो इस लाइब्रेरी का उपयोग करता है। मैं बुलेट फिजिक्स लाइब्रेरी (एक सीएमके सबप्रोजेक्ट के रूप में) के एक संशोधित संस्करण का निर्माण करता हूं। मैं केवल एक फ़ाइल में बुलेट कक्षाओं और कार्यों का उपयोग करता हूं - bullet_interface.cpp - और सभी बुलेट सामग्री "नेमस्पेस {...}" के अंदर छिपी हुई है।साझा लाइब्रेरी नाम टकराव

समस्या यह है कि कुछ अन्य पुस्तकालयों को बुलेट को सिस्टम निर्भरता के रूप में और बुलेट के सिस्टम संस्करण से लिंक करने की आवश्यकता होती है। वास्तव में, मेरी लाइब्रेरी (libopenrave) की निर्भरताओं में से एक बुलेट प्रतीकों का निर्यात करता है। (अधिक विशेष रूप से, यह कभी-कभी गतिशील रूप से एक प्लगइन लोड करता है जो बुलेट प्रतीकों को निर्यात करता है)।

मुझे आश्चर्य है कि मेरी लाइब्रेरी बनाने का कोई तरीका है तो bullet_interface.cpp सही बुलेट फ़ंक्शंस का उपयोग करता है, लेकिन फिर मेरी लाइब्रेरी बुलेट प्रतीकों में से कोई भी दिखाई नहीं देती है। मैं सिस्टम बुलेट का उपयोग नहीं कर सकता क्योंकि मुझे स्रोत कोड में परिवर्तन करना पड़ा था। एक हैकी समाधान सभी बुलेट फ़ंक्शंस और कक्षाओं को एक खोज और प्रतिस्थापन का उपयोग करके नामित करना होगा (लगभग सभी स्ट्रिंग "बीटी") होते हैं। क्या कोई बेहतर तरीका है?

+1

स्पष्ट समाधान है कि आप अपने फिक्स को मुख्य 'बुलेट' लाइब्रेरी में प्राप्त करें और सिस्टम लाइब्रेरी के रूप में उपयोग करें। –

+0

क्या आप सुनिश्चित कर सकते हैं कि आपका संशोधित संस्करण पहले लोड हो गया है और अन्य पुस्तकालयों में सभी निर्भरताओं को पूरा करता है, इसलिए उन्हें सिस्टम की आवश्यकता नहीं है? –

+1

तो libopenrave बुलेट प्रतीकों और बुलेट लाइब्रेरी के साथ लिंक निर्यात करता है, जबकि आपकी प्लगइन बिल्कुल उसी बुलेट प्रतीकों का उपयोग करती है और संशोधित बुलेट लाइब्रेरी के साथ भेज दी जा रही है? यदि ऐसा है, तो आप अपनी संशोधित बुलेट लाइब्रेरी को स्थैतिक lib के रूप में बनाने का प्रयास कर सकते हैं, इसे अपनी प्लगइन में लिंक कर सकते हैं, और यह सुनिश्चित कर सकते हैं कि आपकी प्लगइन में सभी बुलेट प्रतीकों को छुपाया गया हो। आपका प्लगइन कोड उनका उपयोग करेगा, जबकि उन्हें गतिशील प्रतीक तालिका में निर्यात नहीं किया जाएगा। यदि बुलेट मेकफ़ाइल या कोड विशेषताएं स्पष्ट रूप से दृश्यता सेट कर रही हैं, तो आपको ऑब्जेक्ट को जोड़ने से पहले प्रतीक दृश्यता बदलने के लिए बिनटिल्स का उपयोग करना होगा, शायद इसे हैक करना होगा? –

उत्तर

2

यह आप जो चाहते हैं उसे पूरा करने के लिए एक चौराहे का तरीका है, लेकिन यह बुलेट कोड में एक खोज और प्रतिस्थापन धड़कता है।

आप कोशिश कर सकते हैं गोली पुस्तकालय में प्रतीकों 'लगाकर' इस तरह objcopy सुविधा का उपयोग:

objcopy --prefix-symbols=old_ bullet.a 

यह चाहिए एक गतिशील पुस्तकालय के साथ काम के साथ-साथ, लेकिन आप इसे करने की कोशिश करनी होगी। विवरण के लिए this answer देखें।