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


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

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

कोई विचार?


171
2018-02-15 15:52


मूल


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


जवाब:


पहले जीसीसी और जी ++ के लिए वर्तमान अद्यतन-विकल्प सेटअप मिटा दिया गया:

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

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

प्रतीकात्मक लिंक सीसी और सी ++ डिफ़ॉल्ट रूप से स्थापित हैं। हम जीसीसी और जी ++ के लिए प्रतीक लिंक स्थापित करेंगे, फिर सीसी और सी ++ को क्रमशः जीसीसी और जी ++ से लिंक करें।

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++

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

अंतिम चरण जीसीसी, जी ++ के लिए डिफ़ॉल्ट कमांड को कॉन्फ़िगर कर रहा है। 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"

229
2018-02-15 19:05



Thx, तो आपको अद्यतन-विकल्प के लिए उन्हें मैन्युअल रूप से जोड़ना होगा .. आईआईआरसी पहले उबंटू संस्करणों ने स्वचालित रूप से ऐसा किया था। - Nils
अलग-अलग कर्नेल के लिए एनवीडिया मॉड्यूल संकलित करते समय यह मेरे लिए विशेष रूप से उपयोगी होता है। अपडेट-विकल्प समझाए जाने के लिए बहुत बहुत धन्यवाद - earthmeLon
धन्यवाद! मैंने 4.6 से 4.7 तक अपडेट करने के लिए आपके अन्य उत्तर का उपयोग किया। मैं इस जवाब का उपयोग करना चाहता था, लेकिन मुझे यकीन नहीं था कि आप कुछ आदेशों के बाद 10 20 30 की संख्या क्यों डालते हैं। क्या आप कृपया समझा सकते हैं? - Martin Drozdik
मैनपेज के मुताबिक संख्याएं प्राथमिकताएं हैं। मैं इस मामले में कल्पना करता हूं कि संस्करण में से एक अनइंस्टॉल किया गया है, यह निर्धारित करने के लिए उन प्राथमिकताओं का उपयोग करेगा कि कौन सा नया डिफ़ॉल्ट बनना चाहिए। - Ibrahim
@ इब्राहिम: नहीं, वे निर्धारित करते हैं कि जब आप ऑटो मोड का चयन करते हैं तो क्या चुना जाता है - Cookie


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

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++
  • अब अगर हम प्रतीकात्मक लिंक फिर से जांचते हैं तो हम देखेंगे कि जीसीसी और जी ++ अब जीसीसी 4.3 और जी ++ 4.3 से जुड़े हुए हैं:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • अंत में हम फिर से हमारे जीसीसी-वी की जांच कर सकते हैं और सुनिश्चित कर सकते हैं कि हम सही संस्करण का उपयोग कर रहे हैं:
gcc -v
g++ -v

30
2018-02-15 16:49





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

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

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

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

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


20
2018-02-15 16:22



आपकी टिप्पणी के लिए Thx। मुझे सीसी चर के बारे में पता है, लेकिन यह वास्तव में सवाल नहीं था। - Nils
काफी सच है लेकिन मैंने समझाया है क्यों gcc का हिस्सा नहीं है alternatives प्रणाली और यह विशेष रूप से वांछनीय क्यों नहीं है। यदि उनमें से कोई भी आपके दिमाग को बदलने वाला नहीं है, तो इसे मैन्युअल रूप से करें। - Oli♦
यह पहले था? अब उन्होंने इसे हटा दिया ?! विभिन्न जीसीसी संस्करणों के साथ संकलन (उपयोगकर्ता स्पेस) सॉफ़्टवेयर पूरी तरह से ठीक होना चाहिए .. यह चर्चा sill हो रही है .. - Nils
क्या आप समझा सकते हैं कि सिस्टम-वाइड कॉन्फ़िगरेशन सेटिंग के लिए प्रति-आमंत्रण पर्यावरण चर क्यों बेहतर हैं? $ 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


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

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

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

इस त्रुटि में कोई त्रुटि जांच नहीं है और क्या नहीं, इसलिए आप यह जांचना चाहेंगे कि इसे चलाने से पहले क्या चलाना होगा। बस जोड़ दो गूंजसे पहले 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 प्रति पंक्ति खोज रेगेक्स से मेल खाता है।  नतीजा केवल पूरी मिलान वाली रेखा को न दिखाता है। पी perl-regex का उपयोग करने के लिए grep बताता है। मैं यहां रेगेक्स में नहीं जाऊंगा, अगर आप चाहें तो इसे पढ़ें।
  • xargs बस शब्दों में कहें, यह उन परिणामों को इकट्ठा करता है जो इसे पाइप कर रहे हैं और उन्हें सभी को अंत में भेज दें। यानी xargs के बाद कमांड के लिए
  • दे घुमा के अच्छा, यह बाश है। सी ध्वज स्ट्रिंग का उपयोग कमांड के रूप में करने के लिए कहता है। इस उदाहरण में यह भेजे गए तर्कों पर लूप करता है xargs  पहले (0 वें) तर्क को छोड़कर, इस मामले में लूप छोड़ देता है 4.9। लिंक बदलने के लिए लूप में 0 वें तर्क का उपयोग किया जाता है।
  • एलएन-एस-एफ  रों झंडा एक प्रतीकात्मक लिंक बनाता है,  यदि आवश्यक हो तो पहले अनलिंक करने की शक्तियां।

10
2017-10-15 20:52



बहुत पुराना सवाल है, लेकिन यह उत्तर उन रत्नों में से एक प्रतीत होता है जिन्हें हमें पुरानी पोस्ट के उत्तरों की समीक्षा करते समय देखना चाहिए ... - mook765
प्रतिभाशाली! सबसे अच्छा जवाब नीचे हाथ! - Gabriel Staples


एक तरह से अपग्रेड पर विचार करें:

  • sudo apt install gcc-7
  • sudo apt remove gcc-5

एपीटी इस मामले में स्वचालित रूप से लिंक कर्मचारियों को संभालेगा। नया सी / सी ++ संस्करण बहुत संगत है। आपको शायद ही कभी पुराने की आवश्यकता होगी।


-1
2017-10-29 20:02