Frage Wie wähle ich die Standardversion von gcc und g ++?


Also habe ich gcc-4.4 und gcc-4.3 installiert (dasselbe für g ++). Nun, soweit ich mich erinnere, gibt es ein Tool in Ubuntu, das die symbolischen Links für dich setzt, wenn du es nur sagst, welche Version du willst. Es scheint jedoch nicht in der neuesten Version zu funktionieren, was ich enttäuschend finde.

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

Irgendwelche Ideen?


171
2018-02-15 15:52


Ursprung


Wie @Oli erklärte, ist dies eine schlechte Idee. Debian-devel-Mail-Liste: "Ich denke nicht, dass Alternativen für die Versionierung verwendet werden sollten. Zum Beispiel verwenden wir keine Alternativen für gcc, auch nicht für Python." lists.debian.org/debian-devel/2014/06/msg00381.html - hmijail


Antworten:


Zuerst löschte das aktuelle update-alternative Setup für gcc und g ++:

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++

Installieren Sie Pakete

Es scheint, dass sowohl gcc-4.3 als auch gcc-4.4 nach der Installation installiert sind. Wir können jedoch die folgenden Pakete explizit installieren:

sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4

Alternativen installieren

Symbolische Links cc und c ++ sind standardmäßig installiert. Wir werden Symbol-Links für gcc und g ++ installieren und dann cc und c ++ mit gcc bzw. g ++ verknüpfen.

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

Konfigurieren Sie Alternativen

Der letzte Schritt besteht in der Konfiguration der Standardbefehle für gcc, g ++. Es ist einfach, interaktiv zwischen 4.3 und 4.4 zu wechseln:

sudo update-alternatives --config gcc
sudo update-alternatives --config g++

Oder mit Skript wechseln:

#!/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, also muss man sie manuell zu Update-Alternativen hinzufügen. IIRC frühere Ubuntu-Versionen taten das automatisch. - Nils
Dies ist besonders nützlich, wenn ich nvidia-Module für verschiedene Kernel kompiliere. Vielen Dank für die Erklärung der Update-Alternativen - earthmeLon
Vielen Dank! Ich habe Ihre andere Antwort verwendet, um von 4.6 auf 4.7 zu aktualisieren. Ich wollte diese Antwort verwenden, aber ich war mir nicht sicher, warum Sie Zahlen wie 10 20 30 nach einigen Befehlen einfügen. Könnten Sie bitte erklären? - Martin Drozdik
Die Zahlen sind Prioritäten, wie sich herausstellt, laut Manpage. Ich stelle mir vor, falls eine der Versionen deinstalliert wird, wird sie diese Prioritäten verwenden, um zu bestimmen, welcher der neue Standard wird. - Ibrahim
@Ibrahim: Nein, sie bestimmen, was gewählt wird, wenn Sie den Auto-Modus wählen - Cookie


im Terminal ausführen:

gcc -v
g++ -v

Okay, dieser Teil ist ziemlich einfach. Der schwierige Teil ist, dass wenn Sie den Befehl GCC ausstellen, es tatsächlich ein sybolischer Link zu welcher Version von GCC Sie verwenden. Was das bedeutet, können wir einen symbolischen Link vom GCC zu jeder Version von GCC erstellen, die wir wollen.

  • Sie können den symbolischen Link sehen:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • Wir müssen also den GCC-Symlink und den G ++ - Symlink entfernen und sie dann neu erstellen, die mit GCC 4.3 und G ++ 4.3 verlinkt sind:
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++
  • Wenn wir nun die symbolischen Links erneut überprüfen, werden wir sehen, dass GCC & G ++ nun mit GCC 4.3 und G ++ 4.3 verbunden sind:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • Abschließend können wir unseren GCC -v erneut überprüfen und sicherstellen, dass wir die richtige Version verwenden:
gcc -v
g++ -v

30
2018-02-15 16:49





Ist das wirklich wünschenswert? Es gibt ABI-Änderungen zwischen gcc Versionen. Etwas mit einer Version (z. B. dem gesamten Betriebssystem) zu kompilieren und dann etwas anderes mit einer anderen Version zu kompilieren, kann zu Konflikten führen.

Zum Beispiel sollten Kernel-Module immer mit der gleichen Version von kompiliert werden gcc verwendet, um den Kernel zu kompilieren. In diesem Sinne, wenn Sie den Symlink zwischen manuell geändert haben /usr/bin/gcc und die Version, die in Ihrer Version von Ubuntu verwendet wird, könnten zukünftige DKMS-Module das falsche verwenden gcc Ausführung.

Wenn Sie nur Dinge mit einer anderen Version von erstellen möchten gcc, das ist leicht genug, sogar mit Marken. Zum Beispiel können Sie die Version von gcc in dem CC Umgebungsvariable:

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

Sie brauchen es vielleicht nicht auf dem make-Befehl (configure scripts ziehen es normalerweise ein), aber es tut nicht weh.


20
2018-02-15 16:22



Danke für deinen Kommentar. Ich kenne die CC-Variable, aber das war nicht wirklich die Frage. - Nils
Es ist wahr, aber ich habe es erklärt gcc ist nicht Teil der alternatives System und warum dies nicht besonders wünschenswert ist. Wenn keiner von beiden Ihre Meinung ändert, tun Sie es einfach manuell. - Oli♦
Es war davor? Jetzt haben sie es einfach entfernt ?! Das Kompilieren von (Userspace) Software mit verschiedenen gcc-Versionen sollte vollkommen in Ordnung sein. Diese Diskussion wird immer schwächer. - Nils
Können Sie erklären, warum Umgebungsvariablen pro Aufruf einer systemweiten Konfigurationseinstellung vorzuziehen sind? $ sudo apt-get install gcc-6 gcc-7 $ CC="gcc-7" ./configure <much output> $ make # uses gcc-7 Wohingegen sudo update-alternatives gcc gcc-7 hätte sichergestellt, dass Sie nicht versehentlich ABIs schalten. - kfsone


Bearbeiten:

Dies setzt voraus, dass Sie die Version zuerst installiert haben, z.

sudo apt install gcc-4.9 g++-4.9

Original:

Und hier ist ein One-Liner für diejenigen, die faul sind, ändern Sie einfach die Zahl am Ende auf die gewünschte Version. Es wird die Änderung für machen gcc und / oder g ++

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

In diesem Beispiel wechselte ich zu 4.9

Es gibt keine Fehlerprüfungen und was nicht in diesem Beispiel, also sollten Sie überprüfen, was ausgeführt wird, bevor Sie es ausführen. Einfach hinzufügen EchoVor Sudo. Der Vollständigkeit halber stelle ich auch eine Check-Zeile zur Verfügung:

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

Die Ausgabe von der Überprüfung sollte etwas wie sein:

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

Sie können die Version danach mit überprüfen:

gcc --version

Halb-detaillierte Erklärung:

  • ls -la / usr / bin / Listet alle Dateien in auf / usr / bin
  • | pipe (send) die Ausgabe zum nächsten Befehl
  • grep -oP entspricht dem Suchregex pro Zeile. O zeigt nur das Ergebnis und nicht die gesamte übereinstimmende Linie. P weist grep an, perl-regex zu verwenden. Ich werde hier nicht in Regex gehen, lesen Sie es nach, wenn Sie wollen.
  • xargs einfach gesagt, sammelt es die Ergebnisse, die an es geleitet werden und sendet sie alle bis zum Ende. d.h. zu dem Befehl, der auf xargs folgt
  • bash Nun, es ist Bash. Das c Das Flag weist es an, die Zeichenfolge als Befehl zu verwenden. In diesem Beispiel wird eine Schleife über die Argumente ausgeführt, die von gesendet wurden xargs  Durch Überspringen des ersten Arguments (0) wird in diesem Fall die Schleife übersprungen 4.9. Das 0. Argument wird in der Schleife verwendet, um die Verbindung zu ändern.
  • ln -s -f Das s Flagge macht eine symbolische Verbindung, f erzwingt die Aufhebung der Verknüpfung bei Bedarf.

10
2017-10-15 20:52



Sehr alte Frage, aber diese Antwort scheint eine der Edelsteinen zu sein, nach denen wir suchen sollten, wenn wir Antworten auf alte Beiträge überprüfen ... - mook765
Brillant! Beste Antwort Hände frei! - Gabriel Staples


Berücksichtigen Sie ein Upgrade in einer Richtung:

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

apt wird in diesem Fall die Mitarbeiter automatisch bearbeiten. Die neue C / C ++ Version ist ziemlich kompatibel. Du wirst kaum jemals einen alten brauchen.


-1
2017-10-29 20:02