डिफ़ॉल्ट जीसीसी और जी++ संस्करण कैसे चुनें?

इसलिए मैंने जीसीसी-4.4 और जीसीसी-4.3 (जी++के लिए समान) स्थापित किया है । अब जहां तक मुझे याद है कि उबंटू में एक उपकरण है जो आपके लिए सिम्लिंक सेट करता है यदि आप इसे बताते हैं कि आपको कौन सा संस्करण चाहिए । हालांकि यह नवीनतम संस्करण में काम नहीं करता है, जो मुझे निराशाजनक लगता है ।

root@nexus:~# update-alternatives --config gccupdate-alternatives: error: no alternatives for gcc.root@nexus:~# update-alternatives --config ccThere is only one alternative in link group cc: /usr/bin/gccNothing to configure.root@nexus:~# dpkg -l | grep gcc | awk '{print $2}'gccgcc-4.3gcc-4.3-basegcc-4.3-multilibgcc-4.4gcc-4.4-basegcc-4.4-multilibgcc-4.5-basegcc-multiliblib32gcc1libgcc1

कोई विचार?

पहले करंट मिटा दें update-alternatives के लिए सेटअप gcc और g++:

sudo update-alternatives --remove-all gcc sudo update-alternatives --remove-all g++

पैकेज स्थापित करें

ऐसा लगता है कि दोनों gcc-4.3 और gcc-4.4 बिल्ड-आवश्यक स्थापित करने के बाद स्थापित हैं । हालाँकि, हम निम्नलिखित पैकेजों को स्पष्ट रूप से स्थापित कर सकते हैं:

sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4

विकल्प स्थापित करें

प्रतीकात्मक लिंक cc और c++ डिफ़ॉल्ट रूप से स्थापित हैं । हम इसके लिए प्रतीक लिंक स्थापित करेंगे gcc और g++, फिर लिंक cc और c++ को gcc और g++ क्रमशः। (ध्यान दें कि 10, 20 और 30 विकल्प प्रत्येक विकल्प के लिए प्राथमिकताएं हैं, जहां एक बड़ी संख्या एक उच्च प्राथमिकता है । )

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30sudo update-alternatives --set cc /usr/bin/gccsudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30sudo update-alternatives --set c++ /usr/bin/g++

विकल्प कॉन्फ़िगर करें

अंतिम चरण डिफ़ॉल्ट आदेशों को कॉन्फ़िगर कर रहा है gcc, g++. 4.3 और 4.4 के बीच अंतःक्रियात्मक रूप से स्विच करना आसान है:

sudo update-alternatives --config gccsudo update-alternatives --config g++

या स्क्रिप्ट का उपयोग करके स्विच करें:

#!/bin/shif [ -z "$1" ]; then    echo "usage: $0 version" 1>&2    exit 1fiif [ ! -f "/usr/bin/gcc-$1" ] || [ ! -f "/usr/bin/g++-$1" ]; then    echo "no such version gcc/g++ installed" 1>&2    exit 1fiupdate-alternatives --set gcc "/usr/bin/gcc-$1"update-alternatives --set g++ "/usr/bin/g++-$1"

टर्मिनल में निष्पादित करें :

gcc -vg++ -v

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

  • आप प्रतीकात्मक लिंक देख सकते हैं :
ls -la /usr/bin | grep gcc-4.4ls -la /usr/bin | grep g++-4.4
  • तो हमें जो करने की ज़रूरत है वह जीसीसी सिमलिंक और जी++ सिमलिंक को हटा दें और फिर उन्हें जीसीसी 4.3 और जी++ 4.3 से लिंक करें:
rm /usr/bin/gccrm /usr/bin/g++ln -s /usr/bin/gcc-4.3 /usr/bin/gccln -s /usr/bin/g++-4.3 /usr/bin/g++
  • अब अगर हम फिर से प्रतीकात्मक लिंक की जांच करते हैं तो हम देखेंगे कि जीसीसी और जी++ अब जीसीसी 4.3 और जी++ 4.3 से जुड़े हुए हैं:
ls -la /usr/bin/ | grep gccls -la /usr/bin/ | grep g++
  • अंत में हम अपने जीसीसी-वी को फिर से जांच सकते हैं और सुनिश्चित कर सकते हैं कि हम सही संस्करण का उपयोग कर रहे हैं:
gcc -vg++ -v

क्या यह वास्तव में वांछनीय है? के बीच एबीआई परिवर्तन हैं gcc संस्करणों. एक संस्करण (जैसे संपूर्ण ऑपरेटिंग सिस्टम) के साथ कुछ संकलित करना और फिर किसी अन्य संस्करण के साथ कुछ और संकलित करना, संघर्ष का कारण बन सकता है ।

उदाहरण के लिए, कर्नेल मॉड्यूल को हमेशा उसी संस्करण के साथ संकलित किया जाना चाहिए gcc कर्नेल को संकलित करने के लिए प्रयुक्त । इसे ध्यान में रखते हुए, यदि आपने मैन्युअल रूप से सिमलिंक को बीच में बदल दिया है /usr/bin/gcc और उबंटू के आपके संस्करण में उपयोग किया जाने वाला संस्करण, भविष्य के डीकेएमएस-निर्मित मॉड्यूल गलत का उपयोग कर सकते हैं gcc संस्करण।

यदि आप सिर्फ एक अलग संस्करण के साथ चीजों का निर्माण करना चाहते हैं gcc, यह काफी आसान है, यहां तक कि मेकस्क्रिप्ट के साथ भी । उदाहरण के लिए, आप के संस्करण में पास कर सकते हैं gcc में CC पर्यावरण चर:

CC="gcc-4.5" ./configureCC="gcc-4.5" make

आपको मेक कमांड पर इसकी आवश्यकता नहीं हो सकती है (स्क्रिप्ट कॉन्फ़िगर करें आमतौर पर इसे खींचते हैं) लेकिन यह चोट नहीं पहुंचाता है ।

संपादित करें:

यह मानता है कि आपने पहले संस्करण स्थापित किया है, उदाहरण के लिए:

sudo apt install gcc-4.9 g++-4.9

मूल:

और यहां उन लोगों के लिए एक-लाइनर है जो आलसी हैं, बस अपने इच्छित संस्करण के अंत में संख्या बदलें । यह परिवर्तन के लिए कर देगा जीसीसी और / या जी++

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9

इस उदाहरण में मैंने 4.9 पर स्विच किया

इस उदाहरण में कोई त्रुटि जांच नहीं है और क्या नहीं है, इसलिए आप यह जांचना चाहेंगे कि इसे चलाने से पहले क्या चलाया जाएगा । बस जोड़ें इको इससे पहले सुडो. पूर्णता के लिए मैं चेक लाइन भी प्रदान करता हूं:

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do echo sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9

चेक से आउटपुट कुछ ऐसा होना चाहिए:

sudo ln -s -f /usr/bin/g++-4.9 /usr/bin/g++sudo ln -s -f /usr/bin/gcc-4.9 /usr/bin/gccsudo ln -s -f /usr/bin/gcc-ar-4.9 /usr/bin/gcc-arsudo ln -s -f /usr/bin/gcc-nm-4.9 /usr/bin/gcc-nmsudo ln -s -f /usr/bin/gcc-ranlib-4.9 /usr/bin/gcc-ranlibsudo ln -s -f /usr/bin/x86_64-linux-gnu-g++-4.9 /usr/bin/x86_64-linux-gnu-g++sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-4.9 /usr/bin/x86_64-linux-gnu-gccsudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ar-4.9 /usr/bin/x86_64-linux-gnu-gcc-arsudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-nm-4.9 /usr/bin/x86_64-linux-gnu-gcc-nmsudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.9 /usr/bin/x86_64-linux-gnu-gcc-ranlib

आप के बाद संस्करण की जांच कर सकते हैं:

gcc --version

अर्ध-विस्तृत विवरण:

  • एलएस-एलए / यूएसआर / बिन/ सभी फाइलों को सूचीबद्ध करता है / यूएसआर / बिन
  • | पाइप (भेजें) अगले आदेश के लिए उत्पादन
  • ग्रेप-ऑप प्रति पंक्ति खोज रेगेक्स से मेल खाता है । o केवल परिणाम दिखाता है पूरी मिलान वाली रेखा नहीं । P ग्रेप को पर्ल-रेगेक्स का उपयोग करने के लिए कहता है । मैं यहां रेगेक्स में नहीं जाऊंगा, अगर आप चाहते हैं तो इस पर पढ़ें ।
  • एक्सएआरजीएस सीधे शब्दों में कहें, यह उन परिणामों को इकट्ठा करता है जो इसे पाइप किए जाते हैं और उन सभी को अंत तक भेजते हैं । यानी एक्सआरजीएस के बाद कमांड के लिए
  • बैश खैर, यह बैश है । द c ध्वज इसे स्ट्रिंग को कमांड के रूप में उपयोग करने के लिए कहता है । इस उदाहरण में यह भेजे गए तर्कों पर लूप करता है एक्सएआरजीएस पहले (0 वें) तर्क को छोड़ कर, इस मामले में लूप रुक जाता है 4.9. लिंक को बदलने के लिए लूप में 0 वें तर्क का उपयोग किया जाता है ।
  • एलएन-एस-एफs ध्वज एक प्रतीकात्मक लिंक बनाता है, f जरूरत पड़ने पर पहले अनलिंक करने के लिए मजबूर करता है ।

मैं आमतौर पर संबंधित जीसीसी उपकरण भी कॉन्फ़िगर करता हूं (gcc-ar, ...) दास के रूप में, ताकि आप उन सभी को एक बार में बदल सकें:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10 \    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.3 \    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.3 \    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.3sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20 \    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.4 \    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.4 \    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.4
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20

फिर डिफ़ॉल्ट एक का चयन करने के लिए:

sudo update-alternatives --config gccsudo update-alternatives --config g++

मैं जीसीसी/जी++ 9 से स्विच करना चाह रहा था । एक्स (स्थापित किया गया था) 10.x:

  1. नया वांछित संस्करण स्थापित किया:
sudo apt install gcc-10sudo apt install g++-10
  1. नए संस्करण पर स्विच करें:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
  1. के साथ परीक्षण करें:
gcc --versiong++ --version

यदि आपको वापस स्विच करने की आवश्यकता है तो पुराना संस्करण अभी भी स्थापित है, बस कमांड फॉर्म 2 का उपयोग करें । अपने पुराने संस्करण के साथ!

कैसे एक अस्थायी निर्देशिका में एक प्रतीकात्मक लिंक के बारे में:

mkdir x && PATH=$PWD/x:$PATH && ln -s /usr/bin/g++-7 $PWD/x/g++

ठीक है, तो आप संस्करण के लिए क्या उपयोग करते हैं?

जैसा कि @ओली ने समझाया, यह एक बुरा विचार है । डेबियन-डेवेल मेल सूची: "मुझे नहीं लगता कि संस्करण के लिए विकल्पों का उपयोग किया जाना चाहिए । उदाहरण के लिए, हम जीसीसी के लिए विकल्पों का उपयोग नहीं करते हैं, न ही पायथन के लिए । "Re: llvm-defaults vs update alternatives