मैं इसमें भाग लेने वाला अकेला नहीं हो सकता।मैं दो थर्ड-पार्टी स्थैतिक पुस्तकालयों के साथ कैसे लिंक कर सकता हूं (या आसपास काम करता हूं) जो समान प्रतीकों को परिभाषित करते हैं?
मेरे पास एक सी ++ एप्लिकेशन है जिसे एक तृतीय पक्ष और एक एसडीके में सेट की गई एक और स्थिर लाइब्रेरी से लिंक करने की आवश्यकता है। एसडीके ने कुछ घृणास्पद निराशाजनक कारणों के लिए, उसी तीसरे पक्ष की लाइब्रेरी का एक उप-समूह अपने स्वयं के (नामित) lib में दोबारा बनाया है, हालांकि प्रतीक स्वयं को समान नाम दिया गया है और वे नामस्थान के भीतर encapsulated नहीं हैं। मेरा आवेदन स्वयं एक ही तृतीय-पक्ष पुस्तकालय पर निर्भर करता है।
मैंने कुछ विकल्प माना है, लेकिन शायद मुझे कुछ याद आ रहा है और उम्मीद है कि एक नया रूप मेरी मदद करेगा। शायद मैं करीब हूं और इनमें से किसी एक के लिए अगला कदम पता चल जाएगा। मैं गणना करता हूँ कि मैं क्या कोशिश की है और प्रत्येक समाधान की कमियों अब तक: दोनों के साथ
लिंक। मुझे लगभग 2500 लाइनों के प्रतीक पुनर्वितरण/आकार परिवर्तन चेतावनियां और त्रुटियां मिलती हैं। यह तब होता है जब मैंने पहली बार पाया कि उन्होंने एक ही प्रतीक को परिभाषित किया है। मैं ओपनएसएसएल को जी ++ के साथ पुन: संकलित करने की कोशिश कर रहा हूं और इसे इस समय एक नामस्थान में छोड़ सकता हूं ... नीचे संपादित करें देखें ...
केवल एसडीके के साथ लिंक करें। मुझे अपरिभाषित प्रतीक मिलते हैं कि मेरा अपना कोड इस पर निर्भर करता है - यह तब होता है जब मैंने पाया कि तृतीय पक्ष lib का उनका पुनर्मूल्यांकन एक सबसेट है, या कम से कम एक मॉड्यूल अक्षम के साथ कॉन्फ़िगर किया गया था।
केवल तृतीय पक्ष lib के साथ लिंक करें। मेरे पास एसडीके द्वारा रिपोर्ट किए गए कुछ अपरिभाषित प्रतीकों हैं - उनमें से एक वास्तव में तीसरे पक्ष के lib के भीतर एक शीर्षलेख फ़ाइल में # परिभाषित है, इसलिए तीसरे पक्ष में सभी संदर्भ lib परिभाषा को हल करते हैं, लेकिन वहां के संदर्भ नहीं हैं । मैंने इसे सी फाइल में ले जाया, जो इसे हल करता है, हालांकि मेरे पास अभी भी दो अनसुलझे फ़ंक्शन हैं जिन्हें मैं कहीं भी नहीं ढूंढ सकता। यह अब तक का सबसे नज़दीक है।
दोनों में एक 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 को लिंक कर सकते हैं। मैं अब कि ... और आने के लिए कोशिश कर रहा हूँ ...
क्या आप * ओपनसी ओपनसीएल व्युत्पन्न * छोड़ सकते हैं, और इसके बजाय अपने ओपनएसएसएल को लिंक कर सकते हैं? ऐसा लगता है कि अगर आपके पास लिंक करने के लिए ओपनएसएसएल नहीं है तो इसमें libcopopenssl.a शामिल है। यदि वे अपने ओपनएसएसएल व्युत्पन्न को सही ढंग से विभाजित करते हैं तो प्रतीकों को तार करना चाहिए। अर्थात। अपने lib-set * में सबकुछ लिंक करें * उस lib को छोड़कर, और इसके बजाय OpenSSL को लिंक करें। – WhozCraig
वही है जो मैंने ऊपर # 3 में किया था, अनिवार्य रूप से। मुझे एक # डिफाईन को सी फाइल में ले जाना था और फिर से कंपाइल करना था, और फिर भी मेरे पास दो अपरिभाषित प्रतीकों थे। मुझे कहीं भी SSL_get_peer_dh या DH_dup नहीं मिल रहा है। – rutgersmike
* अच्छा * ओपनएसएसएल से प्रतीकों को पकड़ने के लिए आप 'एनएम' के साथ स्क्रिप्ट नहीं कर सके। फिर इस नाम सूची के * खराब * lib को पट्टी करें। यदि वे स्थिर रूप से जुड़े हैं, तो आंतरिक संदर्भ पहले ही हल हो चुके हैं। या यदि नहीं, तो लिंकर को '-r' या' -Ur' का उपयोग करें। –