Wie ändere ich den Standard-GCC-Compiler in Ubuntu?

95

Ich habe gcc-3.3 / g ++ - 3.3 auf Ubuntu 11.04 installiert, das bereits gcc / g ++ - 4.4 enthält. In meinem System sind also sowohl gcc-3.3 als auch 4.4 verfügbar. Ich kann beide Compiler aufrufen, wie ich möchte. Wenn ich nur den Befehl gccaufrufe, wird gcc-4.4 aufgerufen. Um gcc-3.3 aufzurufen, muss ich den Befehl verwenden gcc-3.3.

Wie kann ich den Standard-Compiler als gcc-3.3 ändern? Wenn ich den Befehl ausführe gcc, sollte er gcc-3.3 und nicht gcc-4.4 aufrufen.

Wie kann ich außerdem die Variable CXX in einer make-Datei in gcc-3.3 ändern? Ich möchte einen gemeinsamen globalen Ort im System ändern, anstatt alle make-Dateien zu ändern.

RoboAlex
quelle
2
Für das CXX-Flag können Sie aufrufen CXX=gcc-3.3oder export CXX=gcc-3.3und makewenn Sie es dann global update-alternativesdamit ändern , wird bereits gcc-3.3 verwendet, und dies ist nicht erforderlich.
DipSwitch
1
@RoboAlex: Meine Antwort wurde erneut aktualisiert, um Ihre CXX-Umgebungsvariablenanforderung zu berücksichtigen. Bitte beachten Sie jedoch, dass dies nur dann funktioniert, wenn Sie die Update-Alternativen später ändern.
Jopasserat
Sie müssen nur Ihren PFAD ändern. Die meisten Antworten erwähnen das alternative System, aber sowohl die Debian- als auch die LLVM-Betreuer sind sich einig, dass das alternative System für Alternativen verwendet werden sollte , NICHT für die Versionierung . Weiter erklärt in meiner Antwort.
Hmijail trauert um Rücktritte

Antworten:

112

Wie @Tommy vorgeschlagen hat, sollten Sie verwenden update-alternatives.
Es weist jeder Software einer Familie Werte zu, sodass die Reihenfolge definiert wird, in der die Anwendungen aufgerufen werden.

Es wird verwendet, um verschiedene Versionen derselben Software auf einem System zu verwalten. In Ihrem Fall können Sie mehrere Deklinationen von verwenden gcc, und eine wird bevorzugt.

Um die aktuellen Prioritäten von gcc herauszufinden, geben Sie den Befehl ein, auf den @ Tripleees Kommentar hinweist:

update-alternatives --query gcc

Beachten Sie nun die Priorität, die zugewiesen wird, gcc-4.4da Sie eine höhere Priorität vergeben müssen gcc-3.3.
Um Ihre Alternativen festzulegen, sollten Sie Folgendes haben (vorausgesetzt, Ihre gccInstallation befindet sich bei /usr/bin/gcc-3.3und gcc-4.4die Priorität liegt unter 50) :

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

--bearbeiten--

Schließlich können Sie auch die interaktive Oberfläche von verwenden, update-alternativesum einfach zwischen Versionen zu wechseln. Geben Sie ein update-alternatives --config gcc, um aufgefordert zu werden, die gcc-Version auszuwählen, die Sie unter den installierten verwenden möchten.

--edit 2 -

Um die CXX-Umgebungsvariable systemweit zu korrigieren, müssen Sie die durch @ DipSwitch angegebene Zeile in Ihre .bashrcDatei einfügen (dies gilt nur für Ihren Benutzer, was meiner Meinung nach sicherer ist):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc
Jopasserat
quelle
1
@ Thang auch genannt cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
Jopasserat
Wenn ich die 'Update-Alternativen --config gcc' ausführe, passiert nichts, obwohl ich die gcc und
anaconda
Wie kannst du das aber automatisch machen? Dies erfordert einen manuellen Schritt zum Überprüfen der Ausgabe von update-alternatives --query gcc, der möglicherweise nicht funktioniert, z. B. in einem automatisierten Bereitstellungsskript. Wie kann dies plattformunabhängig gemacht werden?
ely
68

Hier ist ein vollständiges Beispiel für die Antwort von jHackTheRipper für die TL; DR-Menge. :-) In diesem Fall wollte ich g ++ - 4.5 auf einem Ubuntu-System ausführen, das standardmäßig 4.6 ist. Als 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

Hier ist 4.6 immer noch die Standardeinstellung (auch bekannt als "Auto-Modus"), aber ich wechsle explizit vorübergehend zu 4.5 (manueller Modus). Um zu 4.6 zurückzukehren:

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

(Beachten Sie die Verwendung von cpp-binstatt nur cpp. Ubuntu hat bereits eine cppAlternative mit einem Master-Link von /lib/cpp. Das Umbenennen dieses Links würde den /lib/cppLink entfernen , wodurch Skripte beschädigt werden könnten.)

Trevor Robinson
quelle
8
Für die faule Person der Zukunft, die versucht, den installierten g ++ - 5-Compiler als Standard sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
festzulegen
Es bleibt nur eine Frage: Warum macht APT dies bei der Installation des g++-6Pakets nicht?
Rustyx
Ich habe den Standard-Compiler auf diese Weise auf g ++ - 5 umgestellt, aber er verwendet immer noch g ++ - 7 Standardbibliotheken, und jetzt erhalte ich Fehler mit undefinierten __builtinDingen.
Youda008
22

Dies ist die großartige Beschreibung und schrittweise Anleitung zum Erstellen und Verwalten von Master- und Slave-Alternativen (gcc und g ++).

Kurz ist es:

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.
quelle
Was ist mit den 40 und 60. Ich versuche, gcc-6 zu verwenden.
Nyxee
@nyxee 40 und 60 bezeichnen die Priorität, die jedem Eintrag zugewiesen ist. Überprüfen Sie die anderen Antworten auf Vollständigkeit zum Thema
Jopasserat
9

Zwischen 4,8 und 6 mit allen --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

und

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

Wechseln Sie zwischen ihnen mit update-alternatives --config gcc.

szotsaki'gofundme-DefendFromSO
quelle
1
funktioniert gut nach dem Entfernen ccund c++ Zeilen, die Fehler verursachen: Alternative CC kann nicht Slave von GCC sein: Es ist eine Master-Alternative
Palik
7

Jetzt gibt es gcc-4.9 für Ubuntu / präzise.

Erstellen Sie eine Gruppe von Compiler-Alternativen, bei denen der Distributions-Compiler eine höhere Priorität hat:

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

HINWEIS: Die g ++ - Version wird automatisch mit einem gcc-Versionsschalter geändert. cpp-bin muss separat durchgeführt werden, da es eine "cpp" -Masteralternative gibt.

Liste der verfügbaren Compiler-Alternativen auflisten:

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

Gehen Sie folgendermaßen vor, um Version 4.9 von gcc, g ++ und cpp manuell auszuwählen:

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

Überprüfen Sie die Compilerversionen:

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

Stellen Sie die Einstellungen des Distributions-Compilers wieder her (hier: zurück zu Version 4.6):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin
Dileks
quelle
2

Ich habe dieses Problem beim Versuch gefunden, einen neuen Clang-Compiler zu installieren. Es stellt sich heraus, dass sowohl die Debian- als auch die LLVM-Betreuer der Meinung sind, dass das Alternativsystem für Alternativen verwendet werden sollte, NICHT für die Versionierung .

Die von ihnen vorgeschlagene Lösung
PATH=/usr/lib/llvm-3.7/bin:$PATH
sieht ungefähr so aus: wobei /usr/lib/llvm-3.7/bin ein Verzeichnis ist, das vom Paket llvm-3.7 erstellt wurde und das alle Tools mit ihren nicht angehängten Namen enthält. Damit erscheint llvm-config (Version 3.7) mit seinem einfachen Namen in Ihrem PATH. Sie müssen weder mit Symlinks herumspielen noch die in / usr / bin installierte llvm-config-3.7 aufrufen.

Suchen Sie auch nach einem Paket mit dem Namen llvm-defaults (oder gcc-defaults), das möglicherweise eine andere Möglichkeit bietet (ich habe es nicht verwendet).

hmijail trauert um resignierte
quelle
Hervorragende Lösung! Ich benutze es, um unter speziell angefertigten "gcc" -Suiten auszuwählen
Mad Calm
1

Wenn Sie eine schnellere (aber dennoch sehr saubere) Möglichkeit suchen, dies für einen persönlichen Zweck zu erreichen (z. B. wenn Sie ein bestimmtes Projekt mit hohen Anforderungen an die Version des Compilers erstellen möchten), führen Sie einfach die folgenden Schritte aus:

  • Typ echo $PATHund suchen Sie nach einem persönlichen Verzeichnis eine sehr hohe Priorität (in meinem Fall, ich habe ~/.local/bin);
  • Fügen Sie die symbolischen Links in dieses Verzeichnis ein:

Zum Beispiel:

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

Natürlich funktioniert dies für einen einzelnen Benutzer (es ist keine systemweite Lösung), aber andererseits möchte ich nicht zu viele Dinge in meiner Installation ändern.

Thomas Baruchel
quelle
Sie erstellen also Ihr eigenes Ad-hoc-Alternativsystem parallel zum System. Warum nicht das Original benutzen?
Hmijail trauert um Rücktritte
@hmijail Wie ich bereits erklärt habe, verwende ich diese Methode, wenn ich ein einzelnes Projekt erstellen möchte, ohne meine gesamte Installation durcheinander zu bringen. Es funktioniert sehr gut und ich kann es danach leicht entfernen.
Thomas Baruchel
1
Nur Ihren PATH zu ändern wäre schneller, sauberer und würde Ihre gcc-bezogenen Tools miteinander synchronisieren.
Hmijail trauert um den 18.
0

Ich habe nur die folgenden Zeilen verwendet und es hat funktioniert. Ich wollte nur kompilieren VirtualBoxund VMWare WorkStationmit kernel 4.8.10auf Ubuntu 14.04. Anfangs funktionierten die meisten Dinge nicht, zum Beispiel Grafik und Netzwerk. Ich hatte Glück, dass ich VMWare workstationdarum gebeten habe gcc 6.2.0. Ich konnte meine nicht starten, Genymotion Android emulatorsda die Virtualbox nicht verfügbar war. Wird die Ergebnisse später bei Bedarf veröffentlichen.

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
quelle