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


206

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

root@nexus:~# update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc.
root@nexus:~# update-alternatives --config cc
There is only one alternative in link group cc: /usr/bin/gcc
Nothing to configure.


root@nexus:~# dpkg -l | grep gcc | awk '{print $2}'
gcc
gcc-4.3
gcc-4.3-base
gcc-4.3-multilib
gcc-4.4
gcc-4.4-base
gcc-4.4-multilib
gcc-4.5-base
gcc-multilib
lib32gcc1
libgcc1

कोई विचार?


1
जैसा कि @ ओली ने समझाया, यह एक बुरा विचार है। डेबियन-डेवेल मेल सूची: "मुझे नहीं लगता कि विकल्प का उपयोग संस्करण बनाने के लिए किया जाना चाहिए। उदाहरण के लिए, हम gcc के लिए विकल्पों का उपयोग नहीं करते हैं, न ही पायथन के लिए।" lists.debian.org/debian-devel/2014/06/msg00381.html
hmijail

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

जवाबों:


271

पहले 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 ++ के लिए प्रतीक लिंक स्थापित करेंगे, फिर क्रमशः ccc और c ++ को gcc और g ++ से लिंक करेंगे। (है कि ध्यान दें 10, 20और 30विकल्प प्रत्येक विकल्प के लिए प्राथमिकताएं हैं।)

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc

sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++

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

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

sudo update-alternatives --config gcc
sudo update-alternatives --config g++

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

#!/bin/sh

if [ -z "$1" ]; then
    echo "usage: $0 version" 1>&2
    exit 1
fi

if [ ! -f "/usr/bin/gcc-$1" ] || [ ! -f "/usr/bin/g++-$1" ]; then
    echo "no such version gcc/g++ installed" 1>&2
    exit 1
fi

update-alternatives --set gcc "/usr/bin/gcc-$1"
update-alternatives --set g++ "/usr/bin/g++-$1"

4
Thx, इसलिए आपको उन्हें अपडेट-अल्टरनेटिव्स में मैन्युअल रूप से जोड़ना होगा।
नेल्स

1
यह मेरे लिए विशेष रूप से उपयोगी है जब विभिन्न कर्नेल के लिए एनवीडिया मॉड्यूल का संकलन किया जाता है। अद्यतन-विकल्पों को समझाने के लिए बहुत बहुत धन्यवाद
EarthmeLon

1
धन्यवाद! मैंने आपके अन्य उत्तर का उपयोग 4.6 से 4.7 तक अपडेट करने के लिए किया। मैं इस उत्तर का उपयोग करना चाहता था, लेकिन मुझे यकीन नहीं था कि आप कुछ आदेशों के बाद 10 20 30 जैसी संख्याएं क्यों डालते हैं। क्या आप समझा सकते हैं?
मार्टिन Drozdik

7
संख्याएँ प्राथमिकताओं के रूप में यह निकलता है, मैनपेज के अनुसार। मैं इस मामले में कल्पना करता हूं कि संस्करण में से एक की स्थापना रद्द हो गई है यह उन प्राथमिकताओं का उपयोग करेगा जो यह निर्धारित करने के लिए कि नया डिफ़ॉल्ट बनना चाहिए।
इब्राहिम

1
@ इब्राहिम: नहीं, वे निर्धारित करते हैं कि ऑटो मोड का चयन करते समय क्या चुना जाता है
कुकी

41

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

gcc -v
g++ -v

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

  • आप प्रतीकात्मक लिंक देख सकते हैं:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • इसलिए हमें जो करना है, उसे जीसीसी सिम्लिंक और जी ++ सिम्लिंक को हटा दें और फिर उन्हें जीसीसी 4.3 और जी ++ 4.3 से जोड़ा जाए:
rm /usr/bin/gcc
rm /usr/bin/g++

ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
ln -s /usr/bin/g++-4.3 /usr/bin/g++
  • अब अगर हम प्रतीकात्मक लिंक की जाँच करते हैं तो हम देखेंगे कि GCC और G ++ अब GCC 4.3 और G ++ 4.3 से जुड़े हैं:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • अंत में हम अपने GCC -v की फिर से जाँच कर सकते हैं और सुनिश्चित कर सकते हैं कि हम सही संस्करण का उपयोग कर रहे हैं:
gcc -v
g++ -v

1
ठीक वही जो मेरे द्वारा खोजा जा रहा था! जो भी संस्करण मैंने स्थापित किया है, उसे "जीसीसी" करने की क्षमता के बारे में भूल गए। धन्यवाद!
CalebHC

अधिक सरल और आसान और सुरक्षित तरीका!
सेलफ़िश009

21

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

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

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

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

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


1
अपनी टिप्पणी के लिए Thx। मैं सीसी चर के बारे में पता कर रहा हूँ, लेकिन यह वास्तव में सवाल नहीं था।
नेल्स

2
यह सच है लेकिन मैंने समझाया है कि प्रणाली gccका हिस्सा क्यों नहीं alternativesहै और यह विशेष रूप से वांछनीय क्यों नहीं है। यदि उनमें से कोई भी आपके दिमाग को बदलने वाला नहीं है, तो बस इसे मैन्युअल रूप से करें।
ओली

1
यह पहले था? अब वे इसे हटा दिया ?! विभिन्न gcc संस्करणों के साथ कंपाइलिंग (यूज़र्सस्पेस) सॉफ्टवेयर पूरी तरह से ठीक होना चाहिए .. इस चर्चा को मिल रहा है ..
Nils

1
क्या आप बता सकते हैं कि सिस्टम-वाइड कॉन्फ़िगरेशन सेटिंग के लिए प्रति-निमंत्रण वातावरण चर बेहतर क्यों हैं? $ sudo apt-get install gcc-6 gcc-7 $ CC="gcc-7" ./configure <much output> $ make # uses gcc-7 जबकि sudo update-alternatives gcc gcc-7आपने यह सुनिश्चित किया होगा कि आप गलती से एबीआई को स्विच न करें।
kfsone

14

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

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

sudo apt install gcc-4.9 g++-4.9

मूल:

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

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 पर स्विच किया

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

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/gcc
sudo ln -s -f /usr/bin/gcc-ar-4.9 /usr/bin/gcc-ar
sudo ln -s -f /usr/bin/gcc-nm-4.9 /usr/bin/gcc-nm
sudo ln -s -f /usr/bin/gcc-ranlib-4.9 /usr/bin/gcc-ranlib
sudo 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-gcc
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ar-4.9 /usr/bin/x86_64-linux-gnu-gcc-ar
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-nm-4.9 /usr/bin/x86_64-linux-gnu-gcc-nm
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.9 /usr/bin/x86_64-linux-gnu-gcc-ranlib

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

gcc --version

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

  • ls -la / usr / bin / / usr / bin में सभी फाइलों को सूचीबद्ध करता है
  • | पाइप (आउटपुट) अगले कमांड के लिए
  • grep -oP प्रति पंक्ति खोज रेगेक्स से मेल खाता है। केवल परिणाम दिखाता है पूरी मिलान रेखा नहीं। P, grep को perl-regex का उपयोग करने के लिए कहता है। मैं यहाँ regex में नहीं जाऊँगा, यदि आप चाहें तो इस पर पढ़ें।
  • xargs सीधे शब्दों में कहें, यह उन परिणामों को इकट्ठा करता है जो इसे पाइप किए जाते हैं और उन सभी को अंत तक भेजते हैं। यानी xargs के बाद कमांड में
  • अच्छी तरह से बैश , यह बैश है। झंडा यह बताता है एक कमांड के रूप में स्ट्रिंग का उपयोग करना। इस उदाहरण में यह पहले (0 वें) तर्क को छोड़ते हुए xargs से भेजे गए तर्कों पर लूप करता है, इस मामले में लूप स्किप 4.9 हो जाता है । लिंक को बदलने के लिए लूप में 0 वें तर्क का उपयोग किया जाता है।
  • ln -s -f रों झंडा एक प्रतीकात्मक कड़ी, बनाता है पहले अनलिंक करने अगर जरूरत बलों।

2
बहुत पुराना प्रश्न है, लेकिन यह उत्तर हमें उन रत्नों में से एक लगता है, जिन्हें हमें पुराने पदों के उत्तर की समीक्षा करते समय देखना चाहिए ...
mook765

प्रतिभाशाली! सबसे अच्छा जवाब हाथ नीचे!
गेब्रियल स्टेपल्स

-1

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

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


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