Pobrałem g ++ 4.8 z PPA, ale nie możesz ustawić go jako domyślnego?

15

Pobrałem g ++ 4.8 na Ubuntu 12.10, wykonując:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.8

ale kiedy robię:

sudo update-alternatives --config g++

aby przełączyć wersje g ++ mówi:

update-alternatives: error: no alternatives for g++.

Jeśli jednak to zrobię:

g++ --version

to mówi:

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Jak ustawić instalację g ++ 4.8 jako domyślną g ++?

użytkownik997112
źródło

Odpowiedzi:

11

Przede wszystkim musisz dowiedzieć się, gdzie są twoje 4,8 binaria wszystkich narzędzi:

$ which gcc-4.8
/usr/bin/gcc-4.8
$ which g++-4.8
/usr/bin/g++-4.8
$ ls /usr/bin/*-4.8
/usr/bin/cpp-4.8         /usr/bin/x86_64-linux-gnu-cpp-4.8
/usr/bin/g++-4.8         /usr/bin/x86_64-linux-gnu-g++-4.8
/usr/bin/gcc-4.8         /usr/bin/x86_64-linux-gnu-gcc-4.8
/usr/bin/gcc-ar-4.8      /usr/bin/x86_64-linux-gnu-gcc-ar-4.8
/usr/bin/gcc-nm-4.8      /usr/bin/x86_64-linux-gnu-gcc-nm-4.8
/usr/bin/gcc-ranlib-4.8  /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.8
/usr/bin/gcov-4.8

Mamy więc wszystkie nasze pliki binarne, teraz sprawdźmy, czy dla takich plików binarnych są dostępne dowiązania symboliczne:

$ cd /usr/bin
$ ls -l gcc* cpp g++
lrwxrwxrwx 1 root root      7 sep 18 14:02 cpp -> cpp-4.7
lrwxrwxrwx 1 root root      7 abr 22  2013 g++ -> g++-4.7
lrwxrwxrwx 1 root root      7 sep 18 14:02 gcc -> gcc-4.7

Jak widzimy, tylko cpp, g++i gcczawiera łącza symboliczne. Mamy tutaj dwie opcje.

Symlinkowanie

Zastępujemy dowiązania symboliczne naszymi, najpierw usuwając wartości rzeczywiste:

sudo rm /usr/bin/cpp /usr/bin/gcc /usr/bin/g++

Następnie tworzymy nasz

sudo ln -s /usr/bin/cpp-4.8 /usr/bin/cpp
sudo ln -s /usr/bin/gcc-4.8 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.8 /usr/bin/g++

Aby przywrócić go z powrotem, użyj tych samych poleceń, ale zamiast tego z 4.7 lub 4.6

sudo rm /usr/bin/cpp /usr/bin/gcc /usr/bin/g++
sudo ln -s /usr/bin/cpp-4.7 /usr/bin/cpp
sudo ln -s /usr/bin/gcc-4.7 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.7 /usr/bin/g++
Braiam
źródło
Kiedy to zrobiłem: ls -l gcc * cpp g ++ zwróciło: ls: nie można uzyskać dostępu do gcc *: brak takiego pliku lub katalogu ls: nie można uzyskać dostępu do cpp: brak takiego pliku lub katalogu ls: nie można uzyskać dostępu do g ++: brak takiego pliku lub katalogu
user997112
Przeprosiny nie są wymagane :) Po wywołaniu funkcji remove działa, ale kiedy idę do tworzenia „naszych” dowiązań symbolicznych, mówi: sudo ln -s -T / usr / bin / cpp /usr/bin/cpp-4.8 ln: nie powiodło się utworzyć łącze symboliczne `/usr/bin/cpp-4.8 ': Plik istnieje
użytkownik997112
(Dwa razy wywołałem komendę rm, więc po raz drugi potwierdziłem / skarżyłem się, że istniejące linki zostały w rzeczywistości usunięte)
użytkownik997112,
3
To okropny pomysł . Istnieje wiele programów, które używają gccdo kompilacji modułów jądra, a niektóre z nich (np. Nvidia) po cichu ulegają awarii, gdy gccwywoływane przez nich programy nie będą tymi , z którymi jądro zostało skompilowane.
nbubis
1
@ nbubis dobrze, pytanie brzmi: „Jak ustawić moją instalację g ++ 4.8 jako domyślną g ++?”, więc należy zakładać, że ktokolwiek to robi, wie, co robi, nie? Z drugiej strony, jaką alternatywę możesz zaproponować?
Braiam
16

Musisz poinformować update-alternatives, że masz 2 kompilatory C ++, utwórz rekord dla każdego z nich, a następnie skonfiguruj, którego chcesz użyć. Odbywa się to za pomocą:

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6.3 60
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 40
sudo update-alternatives --config g++ 

Od tego momentu jedyną rzeczą wymaganą przy przełączaniu kompilatorów jest to polecenie:

sudo update-alternatives --config g++

Zobacz man update-alternativeswięcej informacji.

Źródło: Jak korzystać z wielu wystąpień gcc?

Radu Rădeanu
źródło
@Braiam Można to zrobić w taki sam sposób z dowolnym pakietem.
Radu Rădeanu
3
Czy ktoś może opracować na 60 i 40? Widziałem to w wielu miejscach
użytkownik997112,
@ user997112 Proponuję przeczytać mężczyznę, ale jeśli lubisz więcej 70 i 30, użyj 70 i 30 ...
Radu Rădeanu
1
@ user997112 są to numery priorytetowe i mają zastosowanie tylko przy użyciu opcji --auto. możesz zobaczyć kilka przykładów przy użyciuupdate-alternatives --display editor
Braiam
2
W dniu 12.04 dostaję: aktualizacja-alternatywy: błąd: alternatywa g ++ nie może być panem: to niewolnik gcc
rickfoosusa
9

To jest świetny opis i instrukcja krok po kroku, jak tworzyć i zarządzać alternatywami master i slave (gcc i g ++).

Wkrótce to

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 
sudo update-alternatives --config gcc
Anton K
źródło
Witamy w Ask Ubuntu! Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Stormvirux
Masz rację. Dodałem istotną część
Anton K
1
Uratowałem mój dzień dzięki tym niewolnikom. TX
Lennart Rolland