2015-09-07 6 views
20

क्लैंग ++ और जी ++ एबीआई असंगत हैं, यहां तक ​​कि मानक कंटेनर के रूप में मूल चीजों के लिए, उदाहरण के लिए, क्लैंग ++ वेबसाइट।यदि क्लैंग ++ और g ++ एबीआई असंगत हैं, बाइनरी में साझा पुस्तकालयों के लिए क्या उपयोग किया जाता है?

सी ++ साझा पुस्तकालयों, यानी libboost, आदि के साथ डेबियन जहाजों ... जो कि कुछ कंपाइलर का उपयोग करते हुए ~ कुछ और उपयोगकर्ता प्रोग्राम के साथ संकलित होते हैं, आमतौर पर काम करते हैं, और लाइब्रेरी नाम उनके लिए उपयोग किए गए कंपाइलर के साथ उलझन में नहीं होते हैं। जब आप क्लैंग स्थापित करते हैं, तो डेबियन नहीं जाता है और आपके सिस्टम पर स्थापित प्रत्येक सी ++ लाइब्रेरी के डुप्लिकेट संस्करणों में खींचता है।

क्या सौदा है? क्या डिस्ट्रो-प्रदत्त सी ++ पुस्तकालयों के खिलाफ लिंक करने की क्षमता है (धन्यवाद सावधानीपूर्वक) कंपाइलर देवताओं की तुलना में यह मजबूत है?

+3

मैंने सोचा कि वास्तव में, क्लैंग को एबीआई जीसीसी के साथ संगत माना जाता है, अन्यथा आप सही हैं कि यह एक बड़ा दुःस्वप्न होगा। हालांकि मैं निश्चित नहीं हूँ। मैंने सोचा था कि जमीन से उतरने के लिए मूल रूप से इस नीति को अपनाने के लिए क्लैंग की आवश्यकता है। –

+0

कुछ हद तक संबंधित: https://stackoverflow.com/questions/11682748/is-clang-abi-same-as-g?rq=1 – edmz

+0

मैं यह नहीं कहना चाहता कि वे एक डुप्लिकेट हैं, बिल्कुल।वह प्रश्न बहुत विशिष्ट संस्करणों को संदर्भित करता है। – Puppy

उत्तर

24
भी मानक कंटेनर

मानक कंटेनर के रूप में कोर के रूप में चीजों के लिए

कि सभी "मूल" नहीं हैं। (ठेठ कार्यान्वयन के लिए) वे पूरी तरह से हेडर में वैध सी ++ में लागू होते हैं, और यदि आप जी ++ और क्लैंग ++ के साथ एक ही शीर्षलेख संकलित करते हैं तो आपको एबीआई संगत आउटपुट मिल जाएगा। यदि आप जीसीसी के बजाए क्लैंग का उपयोग करके न केवल कंटेनर हेडर के विभिन्न संस्करणों का उपयोग करते हैं, तो आपको केवल मानक कंटेनर के रूप में मूल चीजों के लिए असंगतताएं मिलनी चाहिए "।

दोनों जीसीसी और बजना एक क्रॉस-विक्रेता के अनुरूप, पार मंच C++ ABI (मूल रूप से इटेनियम वास्तुकला के लिए विकसित की है, लेकिन यह भी के लिए इस्तेमाल किया x86, x86_64, स्पार्क आदि) वास्तव में ऐसे वर्ग लेआउट के रूप में कोर बातें, नाम मैंगलिंग, अपवाद हैंडलिंग, vtables इत्यादि निर्दिष्ट हैं कि एबीआई और क्लैंग और जीसीसी दोनों इसका पालन करते हैं।

तो दूसरे शब्दों में, यदि आप जीसीसी और क्लैंग के साथ एक ही स्रोत संकलित करते हैं तो आपको एबीआई-संगत बाइनरी मिल जाएगी।

यदि आप इस सामग्री को बेहतर ढंग से समझना चाहते हैं तो मेरी What's an ABI and why is it so complicated? स्लाइड्स देखें।

2

यह शायद सही ढंग से सही सवाल का जवाब नहीं देंगे:

कुछ समय पहले मैं जीसीसी wih कुछ वस्तु फ़ाइलों को संकलित करने की कोशिश की, किसी अन्य वस्तु बजना के साथ फ़ाइलें। अंत में मैंने सब कुछ एक साथ जोड़ा और यह सही ढंग से काम किया।

मेरा मानना ​​है कि लिनक्स वितरण जीसीसी का उपयोग करता है, क्योंकि मैंने कुछ मेकफ़ाइल के उबंटू और सेंटोस की जांच की और उन्होंने जीसीसी का उपयोग किया।

+1

सभी वितरण नहीं, उदा। OpenMandriva लगभग पूरे dsitro के लिए क्लैंग का उपयोग करता है। –

20

जी ++ और क्लैंग विशाल बहुमत के लिए पूरी तरह से एबीआई संगत हैं। इसके अलावा, मानक कंटेनरों के लिए एबीआई असंगतता मानक लाइब्रेरी कार्यान्वयन (libstdC++ या libC++) के गुण हैं, संकलक नहीं। इसलिए, किसी भी पुन: संकलन की कोई आवश्यकता नहीं है।

क्लैंग जमीन से कभी नहीं मिल सका अगर यह एबीआई जी ++ के साथ संगत नहीं था, क्योंकि यह मूल रूप से पहले से मौजूद बड़े पैमाने पर अनुपयोगी होगा। वास्तव में, क्लैंग जीसीसी के साथ इतना संगत है, वे लगभग सभी G ++ के कमांड लाइन इंटरफ़ेस, कंपाइलर इंट्रिनिक्स, बग इत्यादि का उपयोग करते हैं, ताकि आप सचमुच जी ++ के बजाय क्लैंग में ड्रॉप कर सकें और उस समय के विशाल बहुमत, सबकुछ सिर्फ काम।

+0

यह बिल्कुल सही है। क्लैंग जीसीसी के नाम-मैंगलिंग और जीसीसी के कॉलिंग सम्मेलनों का उपयोग करता है। यह जीसीसी के साथ इतना संगत है कि, एक्सकोड के साथ ओएस एक्स पर, 'जी ++' प्रभावी ढंग से 'clang ++' के लिए एक सिम्लिंक है। – nneonneo

+3

अधिक सही होने के लिए, यह एबीआई है, जो जीसीसी नहीं है। Itanium एबीआई जीसीसी से स्वतंत्र है। – Puppy

+1

मैंने कभी इसके बारे में नहीं सुना था। क्या आप g ++ बग के कुछ उदाहरण दे सकते हैं जो ++ नकल करते हैं? –

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