it-swarm.com.de

Wie kann man den Standard-GCC-Compiler in Ubuntu ändern?

Ich habe gcc-3.3/g ++ - 3.3 auf Ubuntu 11.04 installiert, das bereits gcc/g ++ - 4.4 hat. In meinem System sind also sowohl gcc-3.3 als auch 4.4 verfügbar. Ich kann beide Compiler beliebig aufrufen. Wenn ich nur den Befehl gcc aufrufe, wird gcc-4.4 aufgerufen. Um gcc-3.3 aufzurufen, muss ich den Befehl gcc-3.3 verwenden. 

Wie kann ich den Standard-Compiler als gcc-3.3 ändern? Wenn ich den Befehl gcc ausführe, 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 Platz im System ändern, anstatt alle Make-Dateien zu ändern.

85
RoboAlex

Wie @Tommy vorgeschlagen, sollten Sie update-alternatives verwenden.
.__ Er weist jeder Software einer Familie Werte zu, so dass 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 gcc verwenden, und eine davon wird bevorzugt.

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

update-alternatives --query gcc

Beachten Sie nun die Priorität, die gcc-4.4 zugeordnet ist, da Sie gcc-3.3 eine höhere Priorität zuweisen müssen.
Um Ihre Alternativen einzustellen, sollten Sie etwas wie haben (vorausgesetzt, Ihre gcc-Installation befindet sich unter /usr/bin/gcc-3.3 und die Priorität von gcc-4.4 ist kleiner als 50):

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

--edit--

Schließlich können Sie auch die interaktive Schnittstelle von update-alternatives verwenden, um problemlos zwischen den Versionen zu wechseln. Geben Sie update-alternatives --config gcc ein, um gefragt zu werden, welche gcc-Version Sie unter den installierten verwenden möchten.

--edit 2 -

Um die CXX-Umgebungsvariable systemweit zu korrigieren, müssen Sie die durch @ DipSwitch's angegebene Zeile in Ihre .bashrc-Datei einfügen.

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc
97
jopasserat

Hier ist ein vollständiges Beispiel für die Antwort von jHackTheRipper für das TL: DR-Publikum. :-) In diesem Fall wollte ich g ++ - 4.5 auf einem Ubuntu-System ausführen, das standardmäßig auf 4.6 eingestellt 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 (aka "Auto-Modus"), aber ich wechsle explizit vorübergehend auf 4.5 (manueller Modus). Zurück zu 4.6:

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

(Beachten Sie die Verwendung von cpp-bin anstelle von cpp. Ubuntu hat bereits eine cpp-Alternative mit einem Master-Link von /lib/cpp. Wenn Sie diesen Link umbenennen, wird der /lib/cpp-Link entfernt, wodurch die Skripts möglicherweise beschädigt werden.)

65
Trevor Robinson

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

In Kürze 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
17
Anton K

Nun ist gcc-4.9 für Ubuntu/precision verfügbar.

Erstellen Sie eine Gruppe von Compiler-Alternativen, bei denen der Distro-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: g ++ - Version wird automatisch mit einem gcc-Versionswechsel geändert. cpp-bin muss separat ausgeführt werden, da es eine Master-Alternative "cpp" gibt.

Liste der verfügbaren Compiler-Alternativen:

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

Um die Version 4.9 von gcc, g ++ und cpp manuell auszuwählen, führen Sie folgende Schritte aus:

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

Compiler-Versionen prüfen:

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

Wiederherstellen der Distro-Compiler-Einstellungen (hier: zurück zu v4.6):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin
7
dileks

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 mit update-alternatives --config gcc zwischen ihnen.

5
szotsaki

Wenn Sie eine schnellere (aber dennoch sehr saubere) Möglichkeit haben möchten, dies für persönliche Zwecke zu erreichen (wenn Sie beispielsweise ein bestimmtes Projekt erstellen möchten, das einige strenge Anforderungen an die Version des Compilers hat), führen Sie einfach die folgenden Schritte aus:

  • geben Sie echo $PATH ein und suchen Sie nach einem personal -Verzeichnis mit einer sehr hohen Priorität (in meinem Fall habe ich ~/.local/bin);
  • fügen Sie die symbolischen Links in dieses Verzeichnis hinzu:

Zum Beispiel:

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

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

1
Thomas Baruchel

Ich habe dieses Problem gefunden, als ich versuchte, einen neuen Clang-Compiler zu installieren. Stellt sich heraus, dass sowohl das Debian als auch die LLVM-Betreuer sind sich einig , dass das Alternativsystem für alternatives verwendet werden soll, NICHT für versioning

Die Lösung, die sie vorschlagen, ist ungefähr so:
PATH=/usr/lib/llvm-3.7/bin:$PATH
Dabei ist /usr/lib/llvm-3.7/bin ein Verzeichnis, das mit dem Paket llvm-3.7 erstellt wurde und das alle Tools mit ihren nicht-Suffix-Namen enthält. Damit erscheint llvm-config (Version 3.7) mit dem einfachen Namen in Ihrem PATH. Sie müssen sich nicht mit Symlinks herumschlagen und auch 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, dies zu tun (ich habe es nicht verwendet).

1
hmijail

Ich habe nur die Zeilen unten benutzt und es hat funktioniert. Ich wollte nur VirtualBox und VMWare WorkStation mit kernel 4.8.10 auf Ubuntu 14.04 kompilieren. Anfangs funktionierten die meisten Dinge nicht, z. B. Grafik und Vernetzung. Ich hatte Glück, dass VMWare workstation für gcc 6.2.0 beantragt wurde. Ich konnte meinen Genymotion Android emulators nicht starten, da Virtualbox nicht verfügbar war. Wird später Ergebnisse veröffentlichen, wenn nötig.

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
0
nyxee