2010-07-10 15 views
27

पर विशेष रूप से mingw gcc अगर मैं llvm-gcc के साथ एक स्थिर लाइब्रेरी का निर्माण करता हूं, तो इसे mingw gcc का उपयोग करके संकलित प्रोग्राम के साथ लिंक करें, परिणाम परिणाम काम करेगा?क्या एलवीएम-जीसीसी और क्लैंग बाइनरी जीसीसी के साथ संगत है? - विंडोज

llvm-gcc, clang और सामान्य gcc के अन्य संयोजनों के लिए समान है। मुझे दिलचस्पी है कि यह लिनक्स पर कैसे काम करता है (सामान्य गैर-मिंगव जीसीसी का उपयोग करके) और अन्य प्लेटफॉर्म भी, लेकिन विंडोज पर जोर दिया जाता है।

मुझे सभी भाषाओं में भी रूचि है, लेकिन सी और सी ++ पर जोर देने के साथ - स्पष्ट रूप से क्लैंग फोर्ट्रान इत्यादि का समर्थन नहीं करता है, लेकिन मुझे विश्वास है कि llvm-gcc करता है।

मुझे लगता है कि वे सभी ईएलएफ फ़ाइल प्रारूप का उपयोग करते हैं, लेकिन कॉल सम्मेलनों, वर्चुअल टेबल लेआउट इत्यादि के बारे में क्या?

उत्तर

22

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

सी ++ कंप्यूटर्स के बीच मामूली में पोर्टेबल नहीं है; विभिन्न कंपाइलर्स विभिन्न वर्चुअल टेबल कॉल, कन्स्ट्रक्टर, विनाश, नाम मैंगलिंग, टेम्पलेट कार्यान्वयन इत्यादि का उपयोग करते हैं। एक नियम के रूप में आपको एक सी ++ कंपाइलर से ऑब्जेक्ट्स को किसी अन्य के साथ काम नहीं करना चाहिए।

हालांकि हां, क्लैंग ++ लिखने के समय जीसीसी/सी ++ संकलित पुस्तकालयों का भी उपयोग करने में सक्षम है; मैंने हाल ही में जी ++ की मानक रनटाइम लाइब्रेरी का उपयोग करके सीए ++ प्रोग्रामों को संकलित करने के लिए एक रिग स्थापित किया है और यह + लिंक को ठीक से संकलित करता है।

+0

"... क्लैंग ++ लिखने के समय जीसीसी/सी ++ संकलित पुस्तकालयों का भी उपयोग करने में सक्षम है": इस दौरान यह बदलना होगा, मुझे पहले क्लैंग ++ (V3.3) के साथ बूस्ट (V1.54) को दोबारा बनाना होगा Clang ++ - इसके खिलाफ संकलित कोड को जोड़ने में सक्षम होने के नाते। यह भी देखें: http://stackoverflow.com/questions/11081818/linking-troubles-with-boostprogram-options-on-osx-using-llvm/19429798#19429798 –

+3

यह कहना भूल गया कि अगर आप करना चाहते हैं तो आपको यह करना होगा C++ 11 मोड में Clang ++ का उपयोग करें। आपको क्लैंग/एलएलवीएम सी ++ 11-संगत मानक लाइब्रेरी निर्दिष्ट करनी होगी, जीसीसी का मानक lib अच्छा नहीं है। –

+1

लोकप्रिय राय के आधार पर स्विच स्वीकार करें। जहां तक ​​मुझे याद है, मुझे वास्तव में कोई जवाब नहीं मिला था, मैं पूरी तरह से खुश था, इसलिए बस कुछ भी स्वीकार किया जो मेरा स्वयं का जवाब नहीं था। चूंकि यह उत्तर दूसरों के लिए सबसे उपयोगी लगता है, हालांकि, इसे शायद स्वीकार किया जाना चाहिए। – Steve314

1

क्षमा करें - मैं ब्रेक के बाद llvm पर वापस आ रहा था, और ट्यूटोरियल से कहीं ज्यादा नहीं किया है। पहली बार, मिनीजीडब्ल्यू जीसीसी पर निर्माण करने के लिए एलएलवीएम 2.6 प्राप्त करने के संघर्ष के बाद मुझे जला दिया गया - शुक्र है कि एलएलवीएम 2.7 के साथ कोई समस्या नहीं है।

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

मुझे अभी भी पता नहीं है कि संगत एबीआई सी ++ तक फैली हुई है या नहीं। यह कॉल सम्मेलनों का नाम नहीं है, जैसे कि नाम मैंगलिंग, स्ट्रक्चर लेआउट और वीटेबल लेआउट।

सी फ़ंक्शन कॉल करने में सक्षम होने के कारण अधिकांश चीजों के लिए पर्याप्त है, फिर भी कुछ ऐसे मुद्दे हैं जहां मुझे सी ++ की परवाह है।

-2

उम्मीद है कि उन्होंने इसे ठीक किया है, लेकिन मैं llvm-gcc से बचता हूं क्योंकि मैं (भी) एक क्रॉस कंपाइलर के रूप में llvm का उपयोग करता हूं और जब आप 64 बिट मशीन पर llvm-gcc -m32 का उपयोग करते हैं तो -32 को अनदेखा किया जाता है और आपको 64 बिट इंट्स मिलते हैं जिसे आपकी 32 बिट लक्ष्य मशीन पर फिक्र किया जाना है। क्लैंग में वह बग नहीं है और न ही जीसीसी करता है। जितना अधिक मैं क्लैंग का उपयोग करता हूं उतना ही मुझे पसंद है। आपके प्रत्यक्ष प्रश्न के रूप में, पता नहीं, सिद्धांत रूप में इन दिनों लक्ष्यों को अच्छी तरह से जाना जाता है या कॉलिंग सम्मेलन का उपयोग किया जाता है। और आप उम्मीद करेंगे कि जीसीसी और एलवीएम दोनों ही अनुरूप होंगे लेकिन आप कभी नहीं जानते। इसे खोजने का सबसे आसान तरीका दो सरल कार्यों को लिखना, संकलित करना और उपकरण सेट दोनों का उपयोग करके अलग करना है और देखें कि वे कार्यों को कैसे संचालित करते हैं।

+9

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

2

मुझे जवाब नहीं पता है, लेकिन this presentation में स्लाइड 10 का मतलब है कि llvmgcc द्वारा उत्पादित ".o" फ़ाइलों में सामान्य लक्ष्य-विशिष्ट ऑब्जेक्ट कोड की बजाय एलएलवीएम बाइटकोड (.bc) होता है, ताकि लिंक समय अनुकूलन संभव है। हालांकि, एलएलवीएम लिंकर "सामान्य" जीसीसी द्वारा उत्पादित कोड के साथ एलएलवीएम कोड को लिंक करने में सक्षम होना चाहिए, क्योंकि अगली स्लाइड कहती है "यहां मूल .o फाइलों और पुस्तकालयों में लिंक"।

एलएलवीएम एक लिनक्स उपकरण है, मैंने कभी-कभी पाया है कि लिनक्स कंपाइलर विंडोज पर बिल्कुल सही काम नहीं करते हैं। मैं उत्सुक होगा कि आप इसे काम करने के लिए प्राप्त करते हैं या नहीं।

+0

मेरा मानना ​​है कि वे जितना संभव हो उतना हासिल करने के लिए दबाव डाल रहे हैं और शायद गुणवत्ता की उपेक्षा कर सकते हैं .. यह समझाएगा कि मैं लिनक्स पर कैसे हूं और अब मैं llvm प्रोजेक्ट से काम कर रहा हूं। – 0b1100110

+0

एलएलवीएम "एक लिनक्स उपकरण" नहीं है। यह ऐप्पल के ओएस एक्स पर भी पसंदीदा कंपाइलर टूलचेन है जो यूनिक्स है। –

2

मैं ld द्वारा clang की .o फ़ाइलों को लिंक करते समय -m i386pep का उपयोग करता हूं। जीवीसी के साथ एकीकृत करने के लिए llvm की भक्ति को http://dragonegg.llvm.org/ पर खुले तौर पर देखा जाता है, इसलिए यह अनुमान लगाने के लिए बहुत सहज है कि एलवीएम परिवार जीसीसी टूल-चेन के साथ पार-संगत होगा।

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