2010-02-07 14 views
6

मेरे पास फ्री इमेज और ओपनसीवी का उपयोग करने पर एक प्रोजेक्ट काम कर रहा है, वर्तमान में हम इनमें से दोनों से जेपीईजी समर्थन का उपयोग कर रहे हैं (मैं इसे ठीक करने के लिए काम कर रहा हूं, लेकिन अभी इसे रहना है)। किसी भी तरह, फ्री इमेज libjpeg 7.0 को अपने स्थिर पुस्तकालयों में संकलित करता है, और ओपनसीवी की हाईगुई लाइब्रेरी इसे साझा लाइब्रेरी के रूप में जोड़ती है (मेरे सिस्टम पर, उबंटू 9, मुझे libjpeg 6.2 स्थापित है)।स्टेटिक और साझा लाइब्रेरी प्रतीक संघर्ष?

वे एक अंतिम लाइब्रेरी में लिंक करते हैं जिसका उपयोग विभिन्न कार्यक्रमों, जावा रैपर आदि में जोड़ने के लिए किया जाता है। यह सब ठीक काम करता है, कोई प्रतीक संघर्ष या संकलन/लिंक समय के दौरान कुछ भी नहीं। हालांकि, जब मैं OpenCV cvLoadImage फ़ंक्शन का उपयोग करके एक छवि खोलने के लिए जाता हूं, तो हेडर पढ़ने पर यह मर जाता है, संभवतः 6.2 और 7.0 में हेडर के बीच मतभेदों के कारण।

यदि मैं फ्रीइमेज को अनलिंक करता हूं (और उस कोड को टिप्पणी करता हूं जिसके लिए इसकी आवश्यकता होती है), ओपनसीवी कॉल फिर से काम करना शुरू कर देते हैं, तो स्पष्ट रूप से फ्रीइमेज से स्थिर libjpeg प्रतीक प्रतीकों के साथ विरोधाभासी हैं जो libjpeg साझा लाइब्रेरी से लोड किए जाएंगे। मुझे क्या पता नहीं चल रहा है कि मेरा संकलक libjpeg प्रतीकों के दो सेटों के कारण लिंकिंग के दौरान त्रुटि क्यों नहीं फेंक रहा है। इसके अतिरिक्त, मैंने अपने सिस्टम के jpeglib.h शीर्षलेख को 7.0 संस्करण के साथ अस्थायी रूप से देखने का प्रयास किया है, यह देखने के लिए कि क्या ओपनसीवी संकलित है, उसके बाद उस प्रतीक के साथ सिंक हो जाएगा जो फ्रीमेज टेबल पर लाता है, ऐसा लगता है कि इसका कोई फायदा नहीं हुआ है।

आखिरकार मैंने libpepeg में jpeg_read_header में एक printf लगाया है जो फ्रीमेज संकलन करता है, और यह देखने के लिए पुनर्निर्मित करता है कि openCV freeimage libjpeg परिभाषा का उपयोग कर रहा है या नहीं। यह प्रिंट नहीं किया गया है इसलिए मुझे नहीं लगता है।

तो मुझे लगता है कि मेरे सवालों

1) क्यों एक स्थिर libjpeg और एक साझा libjpeg लिंक नहीं उत्पन्न करता है जोड़ने प्रतीकों नकल के कारण त्रुटियों कर रहे हैं?

2) क्या किसी को पता है कि ये दो चीजें एक दूसरे के साथ क्यों विवाद कर रही हैं?

संपादित करें: डीबग मोड में ओपनसीवी संकलित करना और फिर नियमित मोड में फिर से कुछ ढीला खटखटाया और इसे फिर से काम करने लगता है, कोई विचार नहीं कि क्या हो रहा है।

उत्तर

1

यह इस

स्टेटिक पुस्तकालयों की तरह में संकलित कर रहे हैं, गतिशील पुस्तकालयों रनटाइम के दौरान लोड किए गए हैं, लेकिन केवल उन प्रतीकों जो याद कर रहे हैं (मुझे लगता है कि) है। आप साझा पुस्तकालयों को संकलित कर सकते हैं, और फिर आपको शायद प्रतीक टक्कर मिल जाएगी।

तो ओपनसीवी उन प्रतीकों का उपयोग करता है जो संकलित हैं, क्योंकि वे पहले से मौजूद हैं, गतिशील पुस्तकालयों के बजाय। आप ओपनसीवी के संभावित से, अलग-अलग हस्ताक्षरों के साथ स्थिर प्रतीकों का उपयोग करके समाप्त होते हैं।

+0

मेरी धारणा यह है कि यह एक या दूसरी लाइब्रेरी का उपयोग कर रहा है, लेकिन शायद यह किसी भी तरह से थोड़ा सा उपयोग कर रहा है? ओपनसीवी संकलन वाले हेडर को बदलने से समस्या ठीक नहीं हुई .. –

1

आम तौर पर लिंकर बोलने से कई पुस्तकालयों को पारित करने के बारे में ठीक है जो सभी एक ही प्रतीक को हल करते हैं। यह सिर्फ पहले व्यक्ति का उपयोग करता है। आपके लिंकर कमांड लाइन पर पुस्तकालयों का क्रम निर्धारित करेगा कि कौन सा "जीतता है"।

यह, वैसे, ऑब्जेक्ट फ़ाइलों के बारे में सच नहीं है। आपके द्वारा कभी भी उपयोग किए गए प्रत्येक लिंकर का मानना ​​है कि आप चाहते हैं कि आप निर्दिष्ट सभी ऑब्जेक्ट्स का उपयोग करें, और शिकायत करेंगे कि एक से अधिक का एक ही प्रतीक है।

+0

तो सबसे अधिक संभावना है कि यह libjpeg का एक या दूसरा संस्करण होगा जो सही "जीत" देगा? तो या तो यह ओपनसीवी संस्करण चुनता है, जिस स्थिति में चीजें काम करती हैं, या हेडर ओपनसीवी स्विचिंग फ्रीमिज में संकलन के दौरान उपयोग करती है, इसे ठीक करना चाहिए ... लेकिन यह = ( –

+0

यदि कोई लिंकर उठाया गया था आपके द्वारा उपयोग किए जाने वाले हेडर से अलग, तो मैं उम्मीद करता हूं कि यह _not_ काम करे। आपको हेडर _ और भी_ लिंक लिंक पर libs को पुन: व्यवस्थित करने की आवश्यकता होगी, और यहां तक ​​कि यह विफलता की भी कोशिश कर रहा है। वह lib छोड़ने के लिए बेहतर है जिसे आप नहीं चाहते हैं पूरी तरह से लिंक लाइन का उपयोग करें –

2

आपको केवल उन प्रतीकों को निर्यात करने के लिए लिंकिंग विकल्पों को संशोधित करने की आवश्यकता है, फिर संघर्ष में सभी प्रतीकों को स्थिर लिंकिंग में आंतरिक रूप से छुपाया जाएगा, फिर कोई संघर्ष नहीं होगा। डिफ़ॉल्ट रूप से सभी प्रतीकों को निर्यात किया जाता है, यह समस्या है।यह लिंक देखें: http://www.gnu.org/software/gnulib/manual/html_node/Exported-Symbols-of-Shared-Libraries.html

संबंधित मुद्दे