2013-01-09 19 views
51

में सी ++ 11 समर्थन के साथ सी ++ को संकलित करने के लिए कैसे करें मैक टर्मिनल के भीतर सी ++ 11 स्रोत कोड संकलित करना चाहता था लेकिन असफल रहा। मैंने g++ -std=c++11, g++ -std=c++0x, g++ -std=gnu++11 और g++ -std=gnu++0x पर कोशिश की लेकिन कुछ भी काम नहीं किया। टर्मिनल हमेशा unrecognized command line option पढ़ें। हालांकि, g++ -std=gnu और इस तरह की चीजें ठीक काम करती हैं (बेशक सी ++ 11 स्रोत कोड पास नहीं हो सका)।मैक टर्मिनल

सी ++ 11 समर्थन को चालू करने के लिए मुझे किस विकल्प का उपयोग करना चाहिए?

वैसे, मैं जिस कमांड लाइन टूल का उपयोग कर रहा हूं वह एक्सकोड के भीतर स्थापित है, और मुझे पूरा यकीन है कि वे अद्यतित हैं।

+1

जीसीसी जो एक्सकोड के साथ आता है ** ** ** अद्यतित नहीं है, वास्तव में यह प्राचीन है। 'Clang ++' आज़माएं। –

+0

@ एच 2CO3 कूल, पूरी तरह से काम किया। धन्यवाद। हालांकि, 'clang ++' ने मुझे सी ++ 11 सुविधाओं की चेतावनी दी ... उन चेतावनियों को बंद करने के लिए कोई विकल्प? – 4ae1e1

+0

सभी चेतावनियों को बंद करने के लिए '-w' विकल्प का उपयोग करें। –

उत्तर

79

जैसा कि अन्य ने बताया है कि आपको clang++ का उपयोग g++ के बजाय करना चाहिए। साथ ही, आपको डिफ़ॉल्ट libstdC++ के बजाय libC++ लाइब्रेरी का उपयोग करना चाहिए; LibstdC++ का शामिल संस्करण काफी पुराना है और इसलिए सी ++ 11 लाइब्रेरी फीचर्स शामिल नहीं हैं।

clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp 

आप कमांड लाइन उपकरण Xcode के लिए आपको लगता है कि ऐसा किए बिना संकलक और अन्य उपकरणों को चला सकते हैं स्थापित नहीं किया है xcrun उपकरण का उपयोग करके।

xcrun clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp 

इसके अलावा, अगर वहाँ एक विशेष चेतावनी आप को निष्क्रिय करने के आप ऐसा करने संकलक करने के लिए अतिरिक्त झंडे पारित कर सकते हैं चाहते हैं। चेतावनी संदेशों के अंत में यह आपको सबसे विशिष्ट ध्वज दिखाता है जो चेतावनी को सक्षम करेगा। उस चेतावनी को अक्षम करने के लिए आप चेतावनी नाम पर no- प्रीपेड करें।

उदाहरण के लिए आप शायद सी ++ 98 संगतता चेतावनियां नहीं चाहते हैं। उन चेतावनियों के अंत में यह ध्वज -Wc++98-compat दिखाता है और उन्हें अक्षम करने के लिए आप -Wno-c++98-compat पास करते हैं।

+0

अतिरिक्त जानकारी के लिए धन्यवाद! – 4ae1e1

+3

आपने जो कहा है उसका परीक्षण किया। दरअसल, एक सरल 'std :: array' डिफ़ॉल्ट' libstdC++ 'बाहर दस्तक देता है। – 4ae1e1

+0

हां 'std :: is_heap() 'के बिना' ststlib = libC++ ' – shiraz

20

XCode clang और clang++ का उपयोग करता है, जब संकलन नहीं g++ (यह मानते हुए कि आप चीजों से कस्टमाइज़ नहीं किया)। यह आज़माएं:

$ cat t.cpp 
#include <iostream> 

int main() 
{ 
    int* p = nullptr; 
    std::cout << p << std::endl; 
} 
$ clang++ -std=c++11 -stdlib=libc++ t.cpp 
$ ./a.out 
0x0 

bames53 के जवाब के लिए धन्यवाद उनका कहना है कि मैं बाहर -stdlib=libc++ छोड़ दिया था के लिए।

आप कुछ जीएनयू एक्सटेंशन का उपयोग करना चाहते हैं (और यह भी सी ++ 11 का उपयोग करें), आप -std=c++11 के बजाय -std=gnu++11 उपयोग कर सकते हैं, जो सी ++ 11 मोड चालू होगा और यह भी जीएनयू एक्सटेंशन सक्षम रहते हैं।

+0

ग्रेट है। आपका बहुत बहुत धन्यवाद। – 4ae1e1

+8

यह सुनिश्चित नहीं है कि -1 क्या था ... यदि ऐसा इसलिए है क्योंकि मैंने '-stdlib = C++' छोड़ा है तो टिप्पणी करना अच्छा लगेगा, इसलिए मैं इसे तेज़ी से ठीक कर सकता था! – Cornstalks

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