Jak zmienić domyślny kompilator GCC w Ubuntu?

96

Zainstalowałem gcc-3.3 / g ++ - 3.3 na ubuntu 11.04, który ma już gcc / g ++ - 4.4. Więc w moim systemie dostępne są zarówno gcc-3.3, jak i 4.4. Jestem w stanie wywołać oba kompilatory, jak chcę. Jeśli po prostu wywołam polecenie, gcczostanie wywołane gcc-4.4. Aby wywołać gcc-3.3, muszę użyć polecenia gcc-3.3.

Jak mogę zmienić domyślny kompilator na gcc-3.3? Kiedy wykonuję polecenie gcc, powinno wywołać gcc-3.3, a nie gcc-4.4.

Ponadto, jak mogę zmienić zmienną CXX w pliku make na gcc-3.3? Chciałbym zmienić jedno wspólne globalne miejsce w systemie zamiast zmieniać wszystkie pliki make.

RoboAlex
źródło
2
Dla flagi CXX możesz wywołać CXX=gcc-3.3lub, export CXX=gcc-3.3a wtedy, makegdy zmienisz ją globalnie update-alternatives, będzie już używać gcc-3.3 i nie jest to konieczne.
DipSwitch
1
@RoboAlex: ponownie zaktualizowałem moją odpowiedź, aby uwzględnić żądanie zmiennej środowiskowej CXX. Należy jednak pamiętać, że będzie to służyć tylko w przypadku późniejszej modyfikacji alternatyw aktualizacji.
jopasserat
Musisz tylko zmienić PATH. Większość odpowiedzi dotyczy systemu alternatyw, ale zarówno opiekunowie Debiana, jak i LLVM zgadzają się, że system alternatyw powinien być używany do alternatyw , a NIE do wersjonowania . Dalsze wyjaśnienie w mojej odpowiedzi.
hmijail opłakuje resignees

Odpowiedzi:

112

Jak zasugerował @Tommy, powinieneś użyć update-alternatives.
Przypisuje wartości każdemu oprogramowaniu z rodziny, aby określać kolejność wywoływania aplikacji.

Służy do utrzymywania różnych wersji tego samego oprogramowania w systemie. W twoim przypadku będziesz mógł użyć kilku deklinacji gcc, a jedna będzie faworyzowana.

Aby dowiedzieć się, jakie są aktualne priorytety gcc, wpisz polecenie wskazane w komentarzu @ tripleee:

update-alternatives --query gcc

Teraz zwróć uwagę na przypisany priorytet, gcc-4.4ponieważ musisz nadać wyższy gcc-3.3.
Aby ustawić alternatywy, powinieneś mieć coś takiego (zakładając, że twoja gccinstalacja jest zlokalizowana pod adresem /usr/bin/gcc-3.3, a gcc-4.4priorytet jest mniejszy niż 50) :

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

--edytować--

Wreszcie, możesz również skorzystać z interaktywnego interfejsu programu, update-alternativesaby łatwo przełączać się między wersjami. Wpisz update-alternatives --config gccpolecenie, aby wybrać wersję gcc, której chcesz użyć spośród zainstalowanych.

- edycja 2 -

Teraz, aby naprawić zmienną środowiskową CXX w całym systemie, musisz umieścić linię wskazaną przez @ DipSwitch's w swoim .bashrcpliku (zmiana zostanie zastosowana tylko dla twojego użytkownika, co jest moim zdaniem bezpieczniejsze):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc
jopasserat
źródło
1
@thang dzwonił również cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat
Kiedy uruchamiam 'update-alternatives --config gcc', nic się nie dzieje, mimo że mam systemowe gcc i anaconda
Kelthar
jak możesz to zrobić automatycznie? wymaga to ręcznego kroku w celu sprawdzenia danych wyjściowych update-alternatives --query gcc, co może nie działać, np. w automatycznym skrypcie obsługi administracyjnej. Jak można to uczynić agnostykiem platformy?
ely
69

Oto kompletny przykład odpowiedzi jHackTheRipper dla tłumu TL; DR. :-) W tym przypadku chciałem uruchomić g ++ - 4.5 na systemie Ubuntu, który domyślnie ma 4.6. Jako 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

Tutaj 4.6 jest nadal domyślnym (inaczej „tryb automatyczny”), ale wyraźnie przełączam się na 4.5 tymczasowo (tryb ręczny). Aby wrócić do 4.6:

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

(Zwróć uwagę na użycie cpp-binzamiast po prostu cpp. Ubuntu ma już cppalternatywę z głównym łączem /lib/cpp. Zmiana nazwy tego łącza spowoduje usunięcie tego /lib/cppłącza, co może spowodować uszkodzenie skryptów).

Trevor Robinson
źródło
8
Dla leniwych osób w przyszłości próbujących ustawić zainstalowany kompilator g ++ - 5 jako domyślny:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett
Pozostaje tylko jedno pytanie: dlaczego APT nie zrobi tego podczas instalacji g++-6pakietu?
rustyx
W ten sposób przełączyłem domyślny kompilator na g ++ - 5, ale nadal używa on standardowych bibliotek g ++ - 7, a teraz otrzymuję błędy z niezdefiniowanymi __builtinrzeczami.
Youda008
23

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

Krótko mówiąc:

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
Anton K.
źródło
co jest z 40 i 60. Próbuję użyć gcc-6.
nyxee,
@nyxee 40 i 60 oznaczają priorytet przypisany do każdego wpisu, sprawdź inne odpowiedzi, aby uzyskać więcej informacji na ten temat
jopasserat
10

Między 4,8 a 6 ze wszystkimi --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

i

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

Przełączaj się między nimi za pomocą update-alternatives --config gcc.

szotsaki'gofundme-DefendFromSO
źródło
2
działa dobrze po usunięciu cci c++ liniach, które powodują błąd: alternatywne cc nie może być niewolnikiem gcc: jest to główna alternatywa
palik
7

Teraz jest dostępne gcc-4.9 dla Ubuntu / precyzyjne.

Utwórz grupę alternatyw kompilatora, w której kompilator dystrybucji ma wyższy priorytet:

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

UWAGA: wersja g ++ jest zmieniana automatycznie za pomocą przełącznika wersji gcc. cpp-bin należy wykonać osobno, ponieważ istnieje alternatywa mastera „cpp”.

Lista dostępnych alternatyw kompilatora:

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

Aby ręcznie wybrać wersję 4.9 gcc, g ++ i cpp, wykonaj:

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

Sprawdź wersje kompilatora:

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

Przywróć ustawienia kompilatora dystrybucji (tutaj: powrót do wersji 4.6):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin
dileks
źródło
2

Znalazłem ten problem podczas próby zainstalowania nowego kompilatora Clang. Okazuje się, że zarówno opiekunowie Debiana, jak i LLVM zgadzają się, że system alternatyw powinien być używany do alternatyw, a NIE do wersjonowania .

Proponowane przez nich rozwiązanie wygląda mniej więcej tak:
PATH=/usr/lib/llvm-3.7/bin:$PATH
gdzie /usr/lib/llvm-3.7/bin to katalog utworzony przez pakiet llvm-3.7, zawierający wszystkie narzędzia z ich nazwami bez sufiksów. Dzięki temu llvm-config (wersja 3.7) pojawia się ze swoją zwykłą nazwą w Twojej PATH. Nie ma potrzeby grzebania w dowiązaniach symbolicznych ani wywoływania llvm-config-3.7, który został zainstalowany w / usr / bin.

Poszukaj także pakietu o nazwie llvm-defaults (lub gcc-defaults), który może oferować inny sposób zrobienia tego (nie używałem go).

hmijail opłakuje resignees
źródło
Doskonałe rozwiązanie! Używam go do wybierania niestandardowych apartamentów „gcc”
Mad Calm
1

Jeśli chcesz szybszego (ale nadal bardzo czystego) sposobu osiągnięcia tego w celach osobistych (na przykład, jeśli chcesz zbudować konkretny projekt z silnymi wymaganiami dotyczącymi wersji kompilatora), wykonaj następujące kroki:

  • rodzaj echo $PATH i poszukaj katalogu osobistego o bardzo wysokim priorytecie (w moim przypadku mam ~/.local/bin);
  • dodaj dowiązania symboliczne w tym katalogu:

Na przykład:

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

Oczywiście to zadziała dla jednego użytkownika (nie jest to rozwiązanie systemowe), ale z drugiej strony nie lubię zmieniać zbyt wielu rzeczy w mojej instalacji.

Thomas Baruchel
źródło
Więc tworzysz swój własny ad-hoc, równoległy do ​​systemu alternatywny system. Dlaczego nie użyć prawdziwego?
hmijail opłakuje resignees
@hmijail Jak wyjaśniłem, używam tego sposobu, gdy chcę zbudować pojedynczy projekt bez zepsucia całej mojej instalacji. Działa bardzo dobrze i mogę go później łatwo usunąć.
Thomas Baruchel
1
Sama zmiana PATH byłaby szybsza, czystsza i zsynchronizowała ze sobą narzędzia związane z gcc.
hmijail opłakuje resignees
0

Użyłem tylko poniższych linii i zadziałało. Chciałem tylko skompilować VirtualBoxi VMWare WorkStationużyć kernel 4.8.10na Ubuntu 14.04. Początkowo większość rzeczy nie działała, na przykład grafika i sieć. Miałem szczęście, że VMWare workstationo to prosiłeś gcc 6.2.0. Nie mogłem uruchomić, Genymotion Android emulatorsponieważ virtualbox nie działa. W razie potrzeby opublikuje wyniki później.

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
nyxee
źródło