डिफ़ॉल्ट gcc संकलक के रूप में gcc 4.8 कैसे सेट करें


27

मैं हाल ही में स्थापित gcc 4.8का उपयोग कर brewपर OSX 10.7.5 (Lion)। मैं अब उपयोग gcc 4.8करके संकलन कर सकता हूं

g++-4.8 some_file.c

या का उपयोग करके डिफ़ॉल्ट gcc 4.2का उपयोग कर

g++ some_file.c

मैं टर्मिनल पर टाइप करने के gcc 4.8लिए डिफ़ॉल्ट कंपाइलर का उपयोग करना चाहता Xcodeहूं gcc। मुझे लगता है कि मुझे gcc-relatedभीतर लिंक को बदलना होगा dirname $(which gcc)

जब मैं करता हूं

ls -al $(dirname $(which gcc)) | grep 'gcc\|g++\|c++'

मुझे निम्नलिखित मिले:

lrwxr-xr-x     1 root   wheel         7 Jul 31 12:17 c++ -> clang++
-rwxr-xr-x     1 root   wheel    909360 Nov 18  2011 c++filt
lrwxr-xr-x     1 root   wheel         5 Jul 31 12:17 clang++ -> clang
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 g++ -> llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 gcc -> llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        28 Jul 31 12:17 gcov-4.2 -> ../llvm-gcc-4.2/bin/gcov-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-cpp-4.2 -> ../llvm-gcc-4.2/bin/llvm-cpp-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++ -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2

जब मैं दौड़ता हूं: which gcc-4.8मुझे मिलता है /usr/local/bin/gcc-4.8

इसे पूरा करने के लिए कदम बहुत मददगार होंगे।

कृपया और धन्यवाद।


1
बेहतर llvm क्लैंग का उपयोग नहीं करने का कोई कारण?
मैक्स रिड

विशेष रूप से नहीं। वेनिला gcc की तुलना में llvm clang का क्या लाभ है?
रानी

3
तेजी से होने के नाते यह सार्थक चेतावनी भी प्रदान करता है, वास्तव में एक बहुत ही कीमती फीचर की कमी है।
मैक्स राइड

समझा। है clang 3.3के बराबर gcc 4.8? मुझे विश्वास है कि मैं भी कर सकता हूं brew install
क्वीन

सवाल पूछने का पहला सवाल यह है कि आप क्‍लैक के साथ आपूर्ति किए गए क्‍लैंग का उपयोग Gcc-4.8 के बजाय क्‍यों नहीं कर सकते - तो हम क्लैंग 3 का जवाब दे सकते हैं ।.3 काम करेगा
user151019

जवाबों:


20

मान लें कि आप बैश का उपयोग कर रहे हैं (यह डिफ़ॉल्ट है), तो आप इस तरह से PATH में अपनी सर्वोच्च प्राथमिकता के रूप में / usr / स्थानीय / बिन जोड़ सकते हैं:

echo "PATH=\"/usr/local/bin:$PATH\"" >> ~/.bash_profile

यह सुनिश्चित करेगा कि / usr / स्थानीय / बिन आपके रास्ते के अन्य सभी क्षेत्रों से पहले जाँच की जाए। फिर बस नए चर को लोड करने के लिए एक नया टर्मिनल सत्र शुरू करें।

ऐसा करने का एक और तरीका:

  cd /usr/bin
  rm cc gcc c++ g++
  ln -s /usr/local/bin/gcc-4.8 cc
  ln -s /usr/local/bin/gcc-4.8 gcc
  ln -s /usr/local/bin/c++-4.8 c++
  ln -s /usr/local/bin/g++-4.8 g++

मेरे विचार मार्ग में पहले से ही समाहित है usr/local/binecho $PATHपता चलता है: / ऑप्ट / स्थानीय / बिन: / ऑप्ट / स्थानीय / sbin: / ऑप्ट / स्थानीय / शामिल: / usr / स्थानीय / mysql / बिन: / usr / बिन / bjam: / usr / बिन: / बिन / / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin: / usr / लोकल / गो / बिन: / usr / टेक्सिन
quine

एक और विकल्प जोड़ा गया
Digitalchild

1
हाँ इसमें यह शामिल है लेकिन यह / usr / bin के बाद है इसलिए यह पहले नहीं पढ़ा जाता है। पथ क्रमबद्ध है।
डिजिटलचिल्ड

1
दोनों विकल्प मेरे लिए काम नहीं करते प्रतीत होते हैं। मैं /usr/local/binपहली बार 1 में PATHआया था, जिसका कोई प्रभाव नहीं पड़ा - कॉलिंग gccअभी भी दिख रही है। gcc 4.2मैंने तब सिम्बलिंक मैन्युअल रूप से बनाया था, लेकिन जब मैं एक नई टर्मिनल विंडो खोलता हूं और g++( cc|c++|gcc) सभी नहीं मिलते हैं। अजीब। आपकी मदद के लिए धन्यवाद
19

3
मैं /usr/binकिसी भी यूनिक्स (जो कि MacOS X है) के भीतर खेलने की सलाह नहीं दूंगा ... जब तक कि आप अगले यूनिक्स संस्करण के नए संस्करण के स्रोतों पर काम करने वाले विशेषज्ञ न हों।
डैन

19

आपकी मदद के लिए आप सभी को धन्यवाद। मैंने ~/.bash_profileइस प्रकार केवल उपनामों का निर्माण किया :

alias gcc='gcc-4.8'
alias cc='gcc-4.8'
alias g++='g++-4.8'
alias c++='c++-4.8'

लिनकेन का उत्तर बहुत मददगार है, लेकिन मैंने इसे उपनामों के साथ अनुकूलित किया क्योंकि यदि आवश्यक हो तो मुझे पूर्ववत करना आसान है।

विशेष रूप से, अगर PATHऐसा सेट किया गया है /usr/local/bin(जहां काढ़ा लिंक को डालता है gcc 4.8) प्रकट होने से पहले प्रकट होता है /usr/bin(जहां gccडिफ़ॉल्ट रूप से लिंक किया गया है), तो लिंक बनाना जैसा कि भीतर सुझाया गया लिकेन /usr/local/binमेरे लिए सैद्धांतिक रूप से काम करना चाहिए। व्यवहार में, यह किसी कारण से नहीं होता है - एक लिंकर त्रुटि के साथ असफलता और उपनाम उस त्रुटि के आसपास काम करते हैं मेरे बिना उस समस्या को हल करने की आवश्यकता नहीं है।

उपनामों का दूसरा लाभ यह है कि मुझे लिंक करने की आवश्यकता नहीं है, जिसे मैं चाहता हूं कि होमब्रे को संभालना है और उस टूल के साथ प्रतिस्पर्धा नहीं करनी है जिसके लिए gcc का संस्करण जुड़ा हुआ है /usr/local


आपके द्वारा स्थापित किसी भी नए बाइनरी के लिए आपको इसे बदलना पड़ सकता है /usr/local/bin/usr/local/binआपके PATH के भीतर खराब स्थिति के कारण आपके पास अन्य बायनेरिज़ भी स्थापित और छिपी हो सकती हैं । कृपया मेरे उत्तर पर एक बार विचार करें, यह आपकी वास्तविक समस्या पर एक बार, सही और हमेशा के लिए हमला कर रहा है।
डैन

सही। मैंने पहले भी लिकेन का उल्लेख किया था कि मैंने बदल दिया PATHऔर /usr/local/binसभी के सामने रखा । मैंने स्वीकार किया कि आपका कथन सही है और जिसे मुझे बदलने की आवश्यकता है PATH, लेकिन (मेरे मामले में - अर्थात डिफ़ॉल्ट brewस्थापना gcc 4.8) मैं अभी भी gcc 4.8डिफ़ॉल्ट रूप से कॉल नहीं करूंगा जब मैं कॉल करूंगा gccक्योंकि डिफ़ॉल्ट रूप से दोनों के बीच कोई सहानुभूति नहीं है। जैसा कि मैंने ऊपर किया था, मुझे इसे मैन्युअल रूप से बनाना था।
रानी

मैं कह सकता हूं कि इसका अलग-अलग जवाब है, मैं इसका जवाब दूंगा, हालांकि मैं आपके जवाब को हल करूंगा।
डिजिटलचिल्ड

ठीक है - धन्यवाद लिकेन। जैसे ही सिस्टम मुझे ऐसा करने की अनुमति देगा।
रानी

1
मैंने अन्य लोगों की भी कोशिश की लेकिन यह ठीक से काम करता है अगर आप gccसीधे टर्मिनल से चलते हैं। यदि आप एक मेकफाइल का उपयोग करते हैं, तब clangभी उपयोग किया जाता है, तो मुझे केवल कंपाइलर विकल्प का उपयोग करते समय यह समस्या मिली जो केवल उपलब्ध है gcc
टीएन डू

11

मैं gcc-4.8 का उपयोग करता हूं:

export CC=/usr/local/bin/gcc

export CXX=/usr/local/bin/g++

export CPP=/usr/local/bin/cpp

export LD=/usr/local/bin/gcc

alias c++=/usr/local/bin/c++

alias g++=/usr/local/bin/g++

alias gcc=/usr/local/bin/gcc

alias cpp=/usr/local/bin/cpp

alias ld=/usr/local/bin/gcc

alias cc=/usr/local/bin/gcc

और वापस सेब gcc के लिए:

export CC=/usr/bin/gcc

export CXX=/usr/bin/g++

export CPP=/usr/bin/cpp

export LD=/usr/bin/ld

alias c++=/usr/bin/c++

alias g++=/usr/bin/g++

alias gcc=/usr/bin/gcc

alias cpp=/usr/bin/cpp

alias cc=/usr/bin/gcc

alias ld=/usr/bin/ld

या इसे फाइल में डालें और फिर: source <file>


1

मान लें कि आपका वास्तविक शेल आरंभीकरण के माध्यम से किया गया है ~/.profile, तो आपको इसे संशोधित करना होगा ताकि /usr/local/binकिसी भी अन्य पाथ घटक से आगे रखा जा सके जहां gccऔर इसके सभी संबंधित बाइनरी हैं।

इस स्वच्छ संशोधन को करने का तरीका इस प्रकार है:

सीडी

_shell_init = `egrep '(^ |) पथ'। लाभ 2> / देव / अशक्त

अगर ["$ {_ शेल_इनिट}" = ""]; फिर
    # PATH .profile में परिभाषित नहीं है
    # वहां PATH की पहली सापेक्ष परिभाषा स्थापित करें
    गूंज 'पथ = / usr / स्थानीय / बिन: $ {पथ
PATH '>> प्रोफ़ाइल निर्यात करें
    । .profile
    $ {SHELL} निष्पादित करें
अन्य
    # / usr / लोकल / बिन की सभी घटनाओं को दूर करें जहाँ भी वे हो सकते हैं
    # पेट में सेट करें, और इसे अन्य सभी घटकों से आगे डालें
    sed -E -e '/ (^ |) पथ = / s:: / usr / स्थानीय / बिन,' \ _
        -e '/ (^ |) पथ = / s, / usr / स्थानीय / बिन: ,,' \
        -e '/ (^ |) पथ = / s, & / usr / स्थानीय / बिन :,' .profile> .profile.new
    mv .profile.new .profile
    । .profile
    $ {SHELL} निष्पादित करें
फाई

खबरदार: यदि आपकी ~/.profileपहले से ही संरचित है, तो इस शेल स्क्रिप्ट को सही जगह पर सही PATH परिभाषा को फिट करने के लिए मैन्युअल रूप से ट्यून करना होगा।


यह निश्चित रूप से संशोधित करने के लिए एकदम सही है PATHताकि /usr/local/binपहले देखा जाए । यह संभवतः भविष्य में मुझे सिरदर्द से बचाएगा। काश मैं तुम्हें +1 करता। मेरा मुद्दा हालांकि यह है कि gccअभी भी जुड़ा हुआ है gcc 4.2और gcc 4.8इसलिए नहीं कि इसमें कोई सहानुभूति नहीं gcc -> gcc-4.8है /usr/local/bin। मुझे आपकी स्क्रिप्ट के साथ अपडेट करने के बाद भी या तो भीतर या सहिष्णु ( ) के gccरूप में उर्फ की आवश्यकता होगी । ये? gcc-4.8~/.profileln -s gcc-4.8 gcc/usr/local/binPATH
क्विन

मुझे आश्चर्य है brewकि सही प्रतीकात्मक लिंक नहीं जोड़े गए। क्या आपने एक ही विषय पर यह उत्तर पढ़ा: apple.stackexchange.com/a/38247/22003 ?
dan

0

यह माना जाता है कि बनाने वाला उपनाम या अलग gcc बायनेरिज़ से लिंक करने से उन्हें डिफ़ॉल्ट सिस्टम शामिल करने से पहले अपने स्वयं के उपयोग का उपयोग करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.