2012-11-02 27 views
26

मैं इसमें भाग लेने वाला अकेला नहीं हो सकता।मैं दो थर्ड-पार्टी स्थैतिक पुस्तकालयों के साथ कैसे लिंक कर सकता हूं (या आसपास काम करता हूं) जो समान प्रतीकों को परिभाषित करते हैं?

मेरे पास एक सी ++ एप्लिकेशन है जिसे एक तृतीय पक्ष और एक एसडीके में सेट की गई एक और स्थिर लाइब्रेरी से लिंक करने की आवश्यकता है। एसडीके ने कुछ घृणास्पद निराशाजनक कारणों के लिए, उसी तीसरे पक्ष की लाइब्रेरी का एक उप-समूह अपने स्वयं के (नामित) lib में दोबारा बनाया है, हालांकि प्रतीक स्वयं को समान नाम दिया गया है और वे नामस्थान के भीतर encapsulated नहीं हैं। मेरा आवेदन स्वयं एक ही तृतीय-पक्ष पुस्तकालय पर निर्भर करता है।

मैंने कुछ विकल्प माना है, लेकिन शायद मुझे कुछ याद आ रहा है और उम्मीद है कि एक नया रूप मेरी मदद करेगा। शायद मैं करीब हूं और इनमें से किसी एक के लिए अगला कदम पता चल जाएगा। मैं गणना करता हूँ कि मैं क्या कोशिश की है और प्रत्येक समाधान की कमियों अब तक: दोनों के साथ

  1. लिंक। मुझे लगभग 2500 लाइनों के प्रतीक पुनर्वितरण/आकार परिवर्तन चेतावनियां और त्रुटियां मिलती हैं। यह तब होता है जब मैंने पहली बार पाया कि उन्होंने एक ही प्रतीक को परिभाषित किया है। मैं ओपनएसएसएल को जी ++ के साथ पुन: संकलित करने की कोशिश कर रहा हूं और इसे इस समय एक नामस्थान में छोड़ सकता हूं ... नीचे संपादित करें देखें ...

  2. केवल एसडीके के साथ लिंक करें। मुझे अपरिभाषित प्रतीक मिलते हैं कि मेरा अपना कोड इस पर निर्भर करता है - यह तब होता है जब मैंने पाया कि तृतीय पक्ष lib का उनका पुनर्मूल्यांकन एक सबसेट है, या कम से कम एक मॉड्यूल अक्षम के साथ कॉन्फ़िगर किया गया था।

  3. केवल तृतीय पक्ष lib के साथ लिंक करें। मेरे पास एसडीके द्वारा रिपोर्ट किए गए कुछ अपरिभाषित प्रतीकों हैं - उनमें से एक वास्तव में तीसरे पक्ष के lib के भीतर एक शीर्षलेख फ़ाइल में # परिभाषित है, इसलिए तीसरे पक्ष में सभी संदर्भ lib परिभाषा को हल करते हैं, लेकिन वहां के संदर्भ नहीं हैं । मैंने इसे सी फाइल में ले जाया, जो इसे हल करता है, हालांकि मेरे पास अभी भी दो अनसुलझे फ़ंक्शन हैं जिन्हें मैं कहीं भी नहीं ढूंढ सकता। यह अब तक का सबसे नज़दीक है।

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

मैं साथ libs में प्रतीकों की जांच कर रहा है:

nm -C --defined-only lib<name>.a 

और के साथ पूरे वस्तुओं निकालने:

ar -x lib<name>.a <objname>.o 

उम्मीद है कि यह भी अन्य जो तीसरे के साथ लिंक करना पड़ा है में मदद मिलेगी -party libs कि एक दूसरे के साथ संघर्ष। विनिर्देशों के लिए, तीसरे पक्ष की lib OpenSSL है, और एसडीके Opsec है - libcpopenssl.a ओपेसेक में अपमानजनक lib है।

** संपादित करें- देर से प्रवेश संभव वर्कअराउंड ओपनएसएसएल को जी ++ के साथ पुन: संकलित करने और पूरे सामान को नामस्थान में डालने के लिए हो सकता है, और फिर दोनों libs को लिंक कर सकते हैं। मैं अब कि ... और आने के लिए कोशिश कर रहा हूँ ...

+0

क्या आप * ओपनसी ओपनसीएल व्युत्पन्न * छोड़ सकते हैं, और इसके बजाय अपने ओपनएसएसएल को लिंक कर सकते हैं? ऐसा लगता है कि अगर आपके पास लिंक करने के लिए ओपनएसएसएल नहीं है तो इसमें libcopopenssl.a शामिल है। यदि वे अपने ओपनएसएसएल व्युत्पन्न को सही ढंग से विभाजित करते हैं तो प्रतीकों को तार करना चाहिए। अर्थात। अपने lib-set * में सबकुछ लिंक करें * उस lib को छोड़कर, और इसके बजाय OpenSSL को लिंक करें। – WhozCraig

+0

वही है जो मैंने ऊपर # 3 में किया था, अनिवार्य रूप से। मुझे एक # डिफाईन को सी फाइल में ले जाना था और फिर से कंपाइल करना था, और फिर भी मेरे पास दो अपरिभाषित प्रतीकों थे। मुझे कहीं भी SSL_get_peer_dh या DH_dup नहीं मिल रहा है। – rutgersmike

+0

* अच्छा * ओपनएसएसएल से प्रतीकों को पकड़ने के लिए आप 'एनएम' के साथ स्क्रिप्ट नहीं कर सके। फिर इस नाम सूची के * खराब * lib को पट्टी करें। यदि वे स्थिर रूप से जुड़े हैं, तो आंतरिक संदर्भ पहले ही हल हो चुके हैं। या यदि नहीं, तो लिंकर को '-r' या' -Ur' का उपयोग करें। –

उत्तर

3

एक गूगल खोज से संकेत मिलता है कि SSL_get_peer_dh और DH_dup वास्तव में libcpopenssl.a से जोड़ रहे हैं, और वे OpenSSL के मेरी नकल में या तो मौजूद नहीं है।तो आपको वास्तव में उस लाइब्रेरी को लिंक करना होगा। बाइनरी स्तर पर दोनों पुस्तकालयों को एक साथ जोड़ना (ऊपर 4 दृष्टिकोण) को काम करने की संभावना नहीं है - ओपनएसएसएल अपने एबीआई के बारे में बहुत पसंद करता है (वे आमतौर पर .so फ़ाइलों को मामूली संख्या में दिखाए जाते हैं) तो आपको बहुत भाग्यशाली होना होगा। इसलिए एबीआई उनकी .a फ़ाइल के अनुकूल है।

मेरा सुझाव दृष्टिकोण 4 का एक भिन्नता है, लेकिन स्रोत स्तर पर: आपके पास ओपेसेक libcpopenssl.a में लिंक होगा, क्योंकि यह ओपनएसएसएल का एक संशोधित संस्करण है जिसमें अतिरिक्त प्रतीकों (और संभवतः अन्य संशोधन) शामिल हैं, और पकड़ लें ओपनएसएसएल स्रोतों से आपको आवश्यक अतिरिक्त कार्यों और libcpopenssl.a के साथ उन ऑब्जेक्ट्स को पुन: संकलित करें, ताकि वे ओपेसेक संस्करण से फ़ंक्शंस का उपयोग कर सकें। यदि आप केवल कुछ ओपनएसएसएल फ़ंक्शंस का उपयोग कर रहे हैं जिन्हें libcpopenssl.a द्वारा निर्यात नहीं किया जाता है, तो यह काफी कामयाब है।

अनुमोदित, यह अभी भी एक बोझिल दृष्टिकोण है, लेकिन यह प्रतीक संगतता प्राप्त करने का एक गारंटीकृत तरीका है, बशर्ते कि ओपेसेक एसडीके ने ओपनएसएसएल में अर्थपूर्ण परिवर्तन नहीं किए हैं जो अतिरिक्त ओपनएसएसएल कार्यों को तोड़ देगा जो आप खींच रहे हैं आपका प्रोजेक्ट।

(मैं स्टैक ओवरव्लो में नया हूं इसलिए मुझे नहीं पता कि यह सुझाव उचित उत्तर के रूप में योग्य है या नहीं, लेकिन मेरे पास टिप्पणियां पोस्ट करने के लिए प्रतिष्ठा अंक नहीं हैं, वैसे भी। अगर यह अनुचित है तो मैं इसे हटा दूंगा।)

+0

मुझे उन कार्यों पर ज्यादा नहीं मिला, धन्यवाद! मैं ओपनएसएसएल को संशोधित करने के थक गया लेकिन वह जिस तरह से मैं नेतृत्व कर रहा हूं, मैं इसे सी ++ के लिए संकलित करने की कोशिश करने जा रहा हूं और इसे नामस्थान में छोड़ दूंगा। जब मैं अधिक जानकारी प्राप्त करता हूं तो मैं अपडेट करूंगा। – rutgersmike

1

यदि आप गंभीर रूप से उत्सुक हैं, तो इसे खोलने के लिए ओपनएसएसएल के हाल के संस्करण में 24 9 फ़ाइलों को संशोधित किया गया था। अब तक का सबसे आम मुद्दा सी-स्टाइल पॉइंटर का बहुतायत था, खासकर शून्य * के साथ। अब मैं अपने सपनों में "reinterpret_cast" देखता हूं।

यह अकेले इसे हल नहीं करता है - इसे अभी भी पूरी तरह से नामस्थान में रखा जाना चाहिए, जिसका मतलब है कि सभी फाइलों को फिर से संशोधित करना और इसके साथ ही मेरे आंतरिक संदर्भ भी। मुझे लगता है कि मैं अभी इस पर आगे बढ़ने जा रहा हूं।

सभी की मदद के लिए धन्यवाद।