2011-05-22 25 views
5

मैक ओएस एक्स 10.6 के तहत "खराब कोडजेन, पॉइंटर डिफ इन बूस्ट" त्रुटि में त्रुटि मैक ओएस एक्स 10.6 के तहत मैं एक सी ++ साझा लाइब्रेरी का निर्माण कर रहा हूं जो 1.46 को बढ़ावा देने के लिए लिंक करता है। मैं एक्सकोड 4.0 के साथ स्थापित कमांड लाइन टूल्स का उपयोग कर रहा हूं।32-बिट बिल्ड

64-बिट बिल्ड ठीक काम करता है। जब 32-बिट के लिए निर्माण, मैं जोड़ने पर निम्न त्रुटि संदेश मिलता है:

ld: bad codegen, pointer diff in boost::detail::sp_counted_base::sp_counted_base()to global weak symbol vtable for boost::detail::sp_counted_basefor architecture i386 

केवल वैकल्पिक हल मैंने पाया जी ++ उपयोग करने के लिए है - 4.0 32-बिट निर्माण के लिए। मैंने कोशिश किए गए अन्य कंपाइलर्स (g ++ - 4.2, llvm-g ++ - 4.2 और clang ++) सभी उपर्युक्त त्रुटि उत्पन्न करते हैं।

उत्तर

1

समस्या XCode 4.2 के साथ स्थापित लिंकर में तय की गई प्रतीत होती है।

ld: warning: direct access in __ZN5boost6detail15sp_counted_baseC2Ev to global weak symbol __ZTVN5boost6detail15sp_counted_baseE means the weak symbol cannot be overridden at runtime. This was likely caused by different translation units being compiled with different visibility settings. 
+0

क्या आप इस चेतावनी से छुटकारा पाने में कामयाब रहे? –

+0

@ स्टीफन पेचर्ड नहीं, मैंने चेतावनी से छुटकारा पाने के लिए प्रबंधन नहीं किया था। मुझे लगता है कि यदि आप लाइब्रेरी को संकलित करते हैं (उदा।, बूस्ट) सटीक समान दृश्यता सेटिंग के साथ आप केवल इससे छुटकारा पा सकते हैं। हालांकि यह प्रणाली के व्यापक तृतीय पक्ष पुस्तकालयों के लिए व्यावहारिक प्रतीत नहीं होता है। – sakra

2

आप शायद जीसीसी 4.0 के साथ निर्मित लाइब्रेरी को जोड़ रहे हैं, जिसमें जीसीसी 4.2 और क्लैंग के साथ असंगत एबीआई है। आपको अपने मुख्य एप्लिकेशन के रूप में एक ही कंपाइलर विकल्पों का उपयोग करके gcc4.2 या clang के साथ उपयोग की जाने वाली सभी पुस्तकालयों का पुनर्निर्माण करना चाहिए (विशेष रूप से "सी ++ मानक लाइब्रेरी प्रकार" उर्फ ​​STANDARD_C_PLUS_PLUS_LIBRARY_TYPE विकल्प के लिए विशेष नोट जिसे सभी में "स्थैतिक" या "गतिशील" पर सेट किया जाना चाहिए पुस्तकालयों)। एक अन्य उपयोगी विकल्प "डिफ़ॉल्ट रूप से छिपा प्रतीक" है, लेकिन सावधान रहें कि इससे सक्षम होने वाली गड़बड़ी होगी जो अलग-अलग विकल्पों/कंपाइलरों के साथ संकलित पुस्तकालयों के बीच सी ++ ऑब्जेक्ट पास करते हैं।

+0

बूस्ट होना आवश्यक है गतिशील libstdc साथ एक सार्वभौमिक द्विआधारी ++ के रूप में जीसीसी 4.2 के साथ बनाया गया था। आर्किटेक्चर के अलावा मैं 32 और 64 बिट के लिए एक ही सेटिंग्स का उपयोग कर रहा हूं। क्या 64-बिट बिल्ड में इन त्रुटियों को भी नहीं होना चाहिए? – sakra

+1

मैं दो कारणों का अनुमान लगा सकता हूं: या तो एक विकल्प है जो आपके कोड को असंगत बनाता है जो 64-बिट आर्किटेक्चर के लिए समर्थित नहीं है, या 64-बिट एबीआई इसके लिए संगतता को तोड़ नहीं देता है। इसके नजरिए से हालांकि यह आवश्यक नहीं है कि आपके कोड से विवाद हो रहा है, यह बूस्ट का उपयोग करके एक और लाइब्रेरी हो सकती है (और इस प्रकार विभिन्न विकल्पों के साथ बूस्ट हेडर संकलित): क्या आप कुछ अन्य बाइनरी पुस्तकालयों को बढ़ावा देने के अलावा जोड़ रहे हैं? – pqnet

+0

बूस्ट में विभिन्न आर्किटेक्चर के लिए sp_counted_base क्लास के रूपों का एक समूह है ... वे परमाणु संचालन करने के लिए कुछ सीपीयू विशिष्ट सामान कर रहे हैं, इसलिए यह संभव है कि एक आर्किटेक्चर पर कुछ समस्या हो जो दूसरे में दिखाई न दे। FWIW, हमारी प्रयोगशाला में से किसी को कुछ अन्य दृश्यता त्रुटियों को ठीक करने का प्रयास करने के बाद भी यही त्रुटि मिली, हमने क्लाइंट कोड (Ogre3D) का एक साफ निर्माण किया और फिर, यह चला गया। * शग * – Ethan

5

समस्या यह है कि आप डिफ़ॉल्ट दृश्यता (-दृश्य) के लिए अलग-अलग मानों के साथ दो पुस्तकालयों को एक साथ जोड़ रहे हैं। आप या तो दोनों बूस्ट और अपनी परियोजना के लिए एक ही दृश्यता झंडे का उपयोग करना सुनिश्चित कर सकते हैं, या एक स्पष्ट निर्यात प्रतीक फ़ाइल का उपयोग कर सकते हैं।

2

जानकारी के लिए:: XCode में, दृश्यता कोड जनरेशन> इनलाइन विधि छिपा में स्थापित किया जाएगा और चिह्न डिफ़ॉल्ट

नहीं करने के लिए उन की स्थापना से छिपा जोड़ने पर मैं अब त्रुटि संदेश के बजाय एक चेतावनी मिलती है इस मुद्दे को हल करता है।

यह gcc -fvisibility-inlines- छुपे हुए और -दृश्य दृश्य झंडे के लिए effet में मेल खाता है। आप उन लोगों का उपयोग केवल बूस्ट के साथ गड़बड़ करने के बजाय अपने कोड की सेटिंग को समायोजित करने के लिए कर सकते हैं।

+0

मैं इस पर नया हूं इसलिए कृपया मेरी अज्ञानता को क्षमा करें - मैं xcode 4.3.2 में यह कैसे कर सकता हूं? –

1

के रूप में कहा here:

बढ़ावा कई परियोजनाओं से शामिल है, तो प्रत्येक परियोजना में एक ही मान के लिए

Symbols Hidden by Default 
Inline Methods Hidden