2015-03-27 11 views
7

मुझे Apple Mach-O Linker (Id) Error और Undefined symbols in cryptopp at IOS 64-bit project जैसे उचित प्रश्नों की संख्या दिखाई देती है। समस्या आमतौर पर वर्णित के रूप में किया जाता है:एलएलवीएम के libC++ का उपयोग करते समय __1 प्रतीक कहां से आता है?

Undefined symbols for architecture i386: 
    "std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from: 
     cv::gpu::error(char const*, char const*, int, char const*) in opencv2(gpumat.o) 

समस्या अक्सर मिश्रण/मिलान -stdlib=libc++ (LLVM सी ++ क्रम) और -stdlib=libstdc++ (जीएनयू सी ++ क्रम) को कम करता है। एलएलवीएम सी ++ रनटाइम (libc++) में __1 सजावट प्रतीक है, लेकिन जीएनयू सी ++ रनटाइम libstdc++__1 इसके नाम पर प्रतीक है। यह उन प्रतीकों के लिए लिंकर समस्याओं का कारण बनता है जो समान नाम होते हैं (जैसे std::string)।

एलएलवीएम के libC++ का उपयोग करते समय __1 प्रतीक कहां से आता है?

क्यों समस्या नहीं एक gnu नाम स्थान और एक llvm नाम स्थान के साथ हल किया गया था?


यहां एक संबंधित प्रश्न है: libc++ - stop std renaming to std::__1?। लेकिन इस तरह की याद आती है कि एक नाम नहीं होता है।

+1

पर

namespace std { inline namespace __1 { .... 

अधिक की तरह कुछ यह एक इनलाइन नाम स्थान कि libC++ संस्करण के लिए उपयोग करता है है। – Praetorian

उत्तर

4

यह सी ++ 11 inlined नामस्थान

से है libC++ What are inline namespaces for?

+0

धन्यवाद @ सेवरिन। यह एक दिलचस्प लिंक है। तो * अगर * मैंने एक सी ++ 11 कंपाइलर का उपयोग किया, तो 'std :: string' और 'std :: __ 1 :: string' वाली समस्याएं दूर हो जाएंगी क्योंकि कंपाइलर इनलाइन नेमस्पेस को समझ पाएगा? या अगर मैं '-std = C++ 03' का उपयोग करता हूं तो समस्या दूर हो जाएगी क्योंकि इनलाइन नेमस्पेस का उपयोग नहीं किया जाएगा? (अब तक, मैं लोगों को एलएलवीएम रनटाइम या जीएनयू रनटाइम के साथ सबकुछ संकलित करने के लिए कह रहा हूं)। – jww

+2

@jww मुझे विश्वास है कि दोनों कंपाइलर्स (जीसीसी और क्लैंग) इनलाइन नम्सस्पेस को समझते हैं। समस्या घोषणा बनाम परिभाषा के साथ है। यदि आप libC++ शीर्षलेखों का उपयोग कर रहे हैं, तो आपको 'std :: __ 1 ::' उपसर्ग जैसे कुछ 'std :: __ 1 :: string' आदि के साथ चुनी गई घोषणाएं मिलेंगी। यदि आप जीएनयू libstdC++ हेडर का उपयोग कर रहे हैं, तो आप घोषणा 'std :: string' इत्यादि प्राप्त करें। लेकिन फिर आपको libstdC++ से परिभाषाएं लेनी होंगी। a/.so या libC++ से। a/.so। इस तथ्य के कारण, प्रत्येक लाइब्रेरी को अपने स्वयं के शीर्षकों के साथ संकलित किया गया है, परिभाषाओं में भी वही उपसर्ग होता है। जारी रखने के लिए ... –

+2

इस प्रकार, यदि आप libC++ शीर्षकों (std :: __ 1 :: उपसर्ग के साथ) से घोषणाएं चुनते हैं लेकिन libstdC++ (std :: उपसर्ग के साथ) से परिभाषाओं का उपयोग करने का प्रयास करते हैं, तो आपको लिंकर त्रुटि मिल रही है - परिभाषाएं डॉन ज्यादा नहीं अच्छी बात, मुझे लगता है, डीबगिंग एक दुःस्वप्न हो सकता है। तो मैं कहूंगा कि यदि आप जीएनयू टूलचैन का उपयोग कर रहे हैं, तो libstdC++ के खिलाफ लिंक करें, अगर libang ++ –

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