उबंटू में डिफ़ॉल्ट जीसीसी कंपाइलर कैसे बदलें?


95

मैंने ubuntu 11.04 पर gcc-3.3 / g ++ - 3.3 स्थापित किया है, जिसमें पहले से ही gcc / g ++ - 4.4 है। इसलिए मेरे सिस्टम में gcc-3.3 और 4.4 दोनों उपलब्ध हैं। मैं दोनों संकलक को कॉल करने में सक्षम हूं जैसा मैं चाहता हूं। अगर मैं सिर्फ कमांड gccको बुलाऊंगा तो gcc-4.4 को कॉल किया जाएगा। Gcc-3.3 को कॉल करने के लिए, मुझे कमांड का उपयोग करना होगा gcc-3.3

मैं डिफ़ॉल्ट कंपाइलर को gcc-3.3 के रूप में कैसे बदल सकता हूं? जब मैं कमांड निष्पादित करता हूं तो gccइसे gcc-3.3 को कॉल करना चाहिए और gcc-4.4 को नहीं।

इसके अलावा, मैं gcc-3.3 में परिवर्तनशील फ़ाइल में चर CXX को कैसे बदल सकता हूँ? मैं सभी फाइलों को बदलने के बजाय सिस्टम में एक सामान्य वैश्विक स्थान को बदलना चाहता हूं।


2
CXX ध्वज के लिए आप आह्वान कर सकते हैं CXX=gcc-3.3या export CXX=gcc-3.3फिर तब makeजब आपने इसे विश्व स्तर पर बदल दिया है, यह update-alternativesपहले से ही gcc-3.3 का उपयोग करेगा और यह आवश्यक नहीं है।
डिप्सविच

1
@RoboAlex: आपके CXX पर्यावरण चर अनुरोध को ध्यान में रखने के लिए मेरे जवाब को फिर से अपडेट किया। हालाँकि, कृपया ध्यान दें कि यह केवल उस स्थिति में काम करेगा जब आप अपडेट-विकल्प को बाद में संशोधित करेंगे।
jopasserat

आपको केवल अपना पेटीएम बदलना होगा। अधिकांश उत्तर विकल्प प्रणाली का उल्लेख करते हैं, लेकिन डेबियन और एलएलवीएम अनुरक्षक दोनों सहमत हैं कि विकल्प प्रणाली का उपयोग विकल्प के लिए किया जाना चाहिए , न कि संस्करण के लिए । मेरे उत्तर में आगे बताया गया है।
हमीज़ेल ने

जवाबों:


112

जैसा कि @ टॉमी ने सुझाव दिया, आपको उपयोग करना चाहिए update-alternatives
यह एक परिवार के हर सॉफ्टवेयर को मान प्रदान करता है, जिससे यह उस क्रम को परिभाषित करता है जिसमें एप्लिकेशन को बुलाया जाएगा।

यह एक सिस्टम पर एक ही सॉफ्टवेयर के विभिन्न संस्करणों को बनाए रखने के लिए उपयोग किया जाता है। आपके मामले में, आप के कई declinations का उपयोग करने में सक्षम हो जाएगा gcc, और एक इष्ट होगा।

Gcc की वर्तमान प्राथमिकताओं का पता लगाने के लिए, @ tripleee's टिप्पणी द्वारा बताई गई कमांड टाइप करें:

update-alternatives --query gcc

अब, इस प्राथमिकता को ध्यान दें gcc-4.4क्योंकि आपको एक उच्चतर देने की आवश्यकता होगी gcc-3.3
अपने विकल्प सेट करने के लिए, आपके पास कुछ ऐसा होना चाहिए (यह मानते हुए कि आपका gccइंस्टॉलेशन स्थित है /usr/bin/gcc-3.3, और gcc-4.4प्राथमिकता 50 से कम है) :

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 50

--edit--

अंत में, आप update-alternativesसंस्करणों के बीच आसानी से स्विच करने के लिए इंटरेक्टिव इंटरफ़ेस का भी उपयोग कर सकते हैं । उस प्रकार update-alternatives --config gccके gcc संस्करण को चुनने के लिए कहा जाना चाहिए जिसे आप उन संस्थापनों के बीच उपयोग करना चाहते हैं।

--edit 2 -

अब, CXX के पर्यावरण चर को ठीक करने के लिए, आपको अपनी .bashrcफाइल में @ DipSwitch द्वारा दर्शाई गई लाइन को डालना होगा (यह केवल आपके उपयोगकर्ता के लिए परिवर्तन लागू होगा, जो मेरी राय में सुरक्षित है):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc

1
@ थांग भी कहा जाता है cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat

जब मैं 'अपडेट-अल्टरनेटिव्स --config gcc' चलाता हूं, तो कुछ नहीं होता है, भले ही मेरे पास सिस्टम का gcc और एनाकोंडा एक हो
Kelthar

हालांकि आप यह स्वचालित रूप से कैसे कर सकते हैं? इसके लिए एक मैन्युअल कदम की आवश्यकता होती है update-alternatives --query gcc, जिसके आउटपुट को जांचने के लिए काम नहीं करना चाहिए, उदाहरण के लिए एक स्वचालित प्रावधान स्क्रिप्ट में। इसके अलावा, यह कैसे मंच अज्ञेय बनाया जा सकता है?
Ely

68

यहाँ TL के लिए jHackTheRipper के उत्तर का पूरा उदाहरण है; DR भीड़। :-) इस मामले में, मैं एक उबंटू प्रणाली पर g ++ - 4.5 चलाना चाहता था जो 4.6 के लिए डिफॉल्ट करता है। जैसा root:

apt-get install g++-4.5
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.5 50
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 50
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 100
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.5 50
update-alternatives --set g++ /usr/bin/g++-4.5
update-alternatives --set gcc /usr/bin/gcc-4.5
update-alternatives --set cpp-bin /usr/bin/cpp-4.5

यहां, 4.6 अभी भी डिफ़ॉल्ट (उर्फ "ऑटो मोड") है, लेकिन मैं स्पष्ट रूप से 4.5 अस्थायी रूप से (मैनुअल मोड) पर स्विच करता हूं। 4.6 पर वापस जाने के लिए:

update-alternatives --auto g++
update-alternatives --auto gcc
update-alternatives --auto cpp-bin

( cpp-binकेवल के बजाय के उपयोग पर ध्यान दें cpp। उबंटू में पहले से ही cppएक मास्टर लिंक का विकल्प है /lib/cpp। उस लिंक का नाम बदलने से लिंक को हटा दिया जाएगा /lib/cpp, जो स्क्रिप्ट को तोड़ सकता है।)


8
भविष्य के आलसी व्यक्ति के लिए स्थापित g ++ - 5 संकलक डिफ़ॉल्ट होने की कोशिश कर रहा है:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

केवल 1 प्रश्न शेष है: g++-6पैकेज स्थापित करते समय APT ऐसा क्यों नहीं करेगा ?
16

मैंने डिफ़ॉल्ट कंपाइलर को g ++ - 5 इस तरह से स्विच किया, लेकिन यह अभी भी g ++ - 7 मानक पुस्तकालयों का उपयोग करता है, और अब मुझे अपरिभाषित __builtinसामान के साथ त्रुटियां हो रही हैं ।
Youda008

22

यह महान विवरण और चरण-दर-चरण निर्देश है कि मास्टर और गुलाम (gcc और g ++) विकल्प कैसे बनाएं और प्रबंधित करें।

शीघ्र ही यह है:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc

40 और 60 के साथ क्या है। मैं gcc-6 का उपयोग करने की कोशिश कर रहा हूं।
nyxee

@nyxee 40 और 60 प्रत्येक प्रविष्टि को सौंपी गई प्राथमिकता को निरूपित करते हैं, विषय पर अधिक पूर्णता के लिए अन्य उत्तरों की जांच करें
jopasserat

10

4.8 और 6 के बीच सभी --slaves:

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 \
                    10 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-4.8 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-4.8 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-4.8 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-4.8 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8

तथा

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 \
                    15 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-6 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-6 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-6 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-6 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6

उन दोनों के बीच बदलें update-alternatives --config gcc


2
हटाने के बाद ठीक काम करता है ccऔर c++ लाइनें, जो त्रुटि का कारण बनती हैं: वैकल्पिक सीसी जीसीसी का गुलाम नहीं हो सकता है: यह एक मास्टर विकल्प है
palik

7

अब, Ubuntu / सटीक के लिए gcc-4.9 उपलब्ध है।

कंपाइलर विकल्प का एक समूह बनाएं जहां डिस्ट्रो कंपाइलर की प्राथमिकता अधिक हो:

root$ VER=4.6 ; PRIO=60
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

root$ VER=4.9 ; PRIO=40
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

नोट: g ++ संस्करण स्विच gcc संस्करण के साथ स्वचालित रूप से बदल जाता है। cpp-bin को अलग से किया जाना चाहिए क्योंकि "cpp" मास्टर विकल्प मौजूद है।

सूची उपलब्ध संकलक विकल्प:

root$ update-alternatives --list gcc
root$ update-alternatives --list cpp-bin

Gcc, g ++ और cpp के मैन्युअल संस्करण 4.9 का चयन करने के लिए:

root$ update-alternatives --config gcc
root$ update-alternatives --config cpp-bin

संकलक संस्करणों की जाँच करें:

root$ for i in gcc g++ cpp ; do $i --version ; done

डिस्ट्रो कंपाइलर सेटिंग्स को पुनर्स्थापित करें (यहां: v4.6 पर वापस):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin

2

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

वे जिस प्रस्ताव का प्रस्ताव करते हैं वह कुछ इस तरह है:
PATH=/usr/lib/llvm-3.7/bin:$PATH
जहाँ /usr/lib/llvm-3.7/bin एक निर्देशिका है जो कि llvm-3.7 पैकेज द्वारा बनाई गई है, और जिसमें उनके गैर-प्रत्यय नामों के साथ सभी उपकरण शामिल हैं। इसके साथ, आपके PATH में सादे नाम के साथ llvm-config (संस्करण 3.7) दिखाई देता है। सिम्बलिंक के साथ घुलने-मिलने की जरूरत नहीं है, न ही llvm-config-3.7 को कॉल करने के लिए जो / usr / bin में इंस्‍टॉल हुआ है।

इसके अलावा, llvm-defaults (या gcc-defaults) नाम के एक पैकेज की जांच करें, जो ऐसा करने के लिए अन्य तरीके की पेशकश कर सकता है (मैंने इसका उपयोग नहीं किया था)।


उत्कृष्ट समाधान! मुझे इसका उपयोग कस्टम निर्मित "जीसीसी" स्वीट्स
मैड कैलम

1

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

  • टाइप करें echo $PATHऔर एक बहुत उच्च प्राथमिकता वाले व्यक्तिगत निर्देशिका की तलाश करें (मेरे मामले में, मेरे पास ~/.local/bin);
  • इस निर्देशिका में प्रतीकात्मक लिंक जोड़ें:

उदाहरण के लिए:

ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc
ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++

बेशक, यह एकल उपयोगकर्ता के लिए काम करेगा (यह एक सिस्टम वाइड सॉल्यूशन नहीं है), लेकिन दूसरी तरफ मैं अपने इंस्टॉलेशन में बहुत सी चीजों को बदलना पसंद नहीं करता।


इसलिए आप अपना स्वयं का एड-हॉक, समानांतर-से-सिस्टम की वैकल्पिक व्यवस्था बना रहे हैं। असली चीज़ का उपयोग क्यों नहीं करते?
हमीज़ेल ने इस्तीफा दे दिया

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

1
बस अपने PATH को बदलने से तेज, क्लीनर होगा और एक दूसरे के साथ आपके gcc-related टूल रखेगा।
हमीज़ेल ने इस्तीफा दे दिया

0

मैंने बस नीचे की पंक्तियों का उपयोग किया और यह काम किया। मैं तो बस संकलित करने के लिए करना चाहता था VirtualBoxऔर VMWare WorkStationका उपयोग कर kernel 4.8.10पर Ubuntu 14.04। प्रारंभ में, ज्यादातर चीजें उदाहरण के ग्राफिक्स और नेटवर्किंग के लिए काम नहीं कर रही थीं। मैं भाग्यशाली था कि इसके लिए VMWare workstationअनुरोध किया gcc 6.2.0Genymotion Android emulatorsवर्चुअलबॉक्स डाउन होने के कारण मैं अपनी शुरुआत नहीं कर सका । यदि आवश्यक हो तो बाद में परिणाम पोस्ट करेंगे।

VER=4.6 ; PRIO=60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=6 ; PRIO=50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=4.8 ; PRIO=40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.