it-swarm.com.de

Wie wählt man die Standardversion von gcc und g ++ aus?

Also habe ich gcc-4.4 und gcc-4.3 installiert (dasselbe für g ++). Soweit ich mich erinnere, gibt es in Ubuntu ein Tool, das die Symlinks für Sie festlegt, wenn Sie nur angeben, welche Version Sie möchten. Allerdings scheint es in der neuesten Version nicht zu funktionieren, was ich enttäuschend finde.

[email protected]:~# update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc.
[email protected]:~# update-alternatives --config cc
There is only one alternative in link group cc: /usr/bin/gcc
Nothing to configure.


[email protected]:~# 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?

201
Nils

Zuerst wurden die aktuellen Update-Alternativen für gcc und g ++ gelöscht:

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

Install Packages

Es scheint, dass sowohl gcc-4.3 als auch gcc-4.4 nach der Installation von build-essential installiert werden. 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 ++ werden standardmäßig installiert. Wir werden Symbollinks für gcc und g ++ installieren und dann cc und c ++ mit gcc bzw. g ++ verknüpfen. (Beachten Sie, dass die Optionen 10, 20 und 30 die Prioritäten für jede Alternative sind.)

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

Alternativen konfigurieren

Der letzte Schritt ist die 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 wechseln Sie mit Skript:

#!/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"
262
hhlp

im Terminal ausführen:

gcc -v
g++ -v

Okay, dieser Teil ist ziemlich einfach. Der schwierige Teil ist, dass wenn Sie den Befehl GCC eingeben, es sich tatsächlich um eine sybolische Verknüpfung zu der Version von GCC handelt, die Sie verwenden. Dies bedeutet, dass wir eine symbolische Verbindung von GCC zu jeder gewünschten Version von GCC herstellen können.

  • 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 verknüpft 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 ++ jetzt mit GCC 4.3 und G ++ 4.3 verknüpft sind:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • Schließlich können wir unser GCC -v noch einmal überprüfen und sicherstellen, dass wir die richtige Version verwenden:
gcc -v
g++ -v
40
hhlp

Ist das wirklich wünschenswert? Es gibt ABI-Änderungen zwischen gcc Versionen. Das Kompilieren von etwas mit einer Version (z. B. dem gesamten Betriebssystem) und das anschließende Kompilieren von etwas anderem mit einer anderen Version kann zu Konflikten führen.

Beispielsweise sollten Kernelmodule immer mit der gleichen Version von gcc kompiliert werden, mit der der Kernel kompiliert wurde. Wenn Sie den Symlink zwischen /usr/bin/gcc und der in Ihrer Ubuntu-Version verwendeten Version manuell geändert haben, verwenden zukünftige DKMS-Module möglicherweise die falsche gcc -Version.

Wenn Sie nur Dinge mit einer anderen Version von gcc erstellen möchten, ist das auch mit make-Skripten ganz einfach. Beispielsweise können Sie die Version von gcc in der Umgebungsvariablen CC übergeben:

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

Sie benötigen es möglicherweise nicht für den Befehl make (Configure-Skripte ziehen es normalerweise ein), aber es tut nicht weh.

21
Oli

Bearbeiten:

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

Sudo apt install gcc-4.9 g++-4.9

Original:

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

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 habe ich auf 4.9 umgestellt

Es gibt keine Fehlerprüfungen und was nicht in diesem Beispiel. Daher möchten Sie möglicherweise überprüfen, was ausgeführt wird, bevor Sie es ausführen. Fügen Sie einfach Echo vor Sudo hinzu. Der Vollständigkeit halber stelle ich auch folgende Checkline 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 der Prüfung sollte ungefähr so ​​aussehen:

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 überprüfen mit:

gcc --version

Halb detaillierte Erklärung:

  • ls -la/usr/bin / listet alle Dateien in / usr/bin auf
  • leitet die Ausgabe an den nächsten Befehl weiter
  • grep -oP entspricht dem Suchausdruck pro Zeile. o zeigt nur das Ergebnis an, nicht die gesamte übereinstimmende Zeile. P weist grep an, Perl-Regex zu verwenden. Ich werde hier nicht auf reguläre Ausdrücke eingehen, sondern es nachlesen, wenn Sie wollen.
  • xargs Einfach ausgedrückt, es sammelt die Ergebnisse, die an ihn weitergeleitet werden, und sendet sie alle bis zum Ende. zum Befehl, der xargs folgt
  • bash Nun, es ist bash. Das c Flag weist es an, den String als Befehl zu verwenden. In diesem Beispiel werden die von xargs gesendeten Argumente durch Überspringen des ersten (0ten) Arguments durchlaufen. In diesem Fall überspringt die Schleife 4.9. Das 0-te Argument wird in der Schleife verwendet, um die Verknüpfung zu ändern.
  • ln -s -f Das Flag s stellt eine symbolische Verknüpfung her. f erzwingt bei Bedarf zuerst das Aufheben der Verknüpfung.
14
Ale

Erwägen Sie ein Upgrade in eine Richtung:

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

apt wird in diesem Fall das Linkpersonal automatisch behandeln. Neue C/C++ - Version ist ziemlich kompatibel. Du würdest kaum jemals einen alten brauchen.

0
Sergei

Wie wäre es mit einem symbolischen Link in einem temporären Verzeichnis:

mkdir x && PATH=$PWD/x:$PATH && ln -s /usr/bin/g++-7 $PWD/x/g++

0
user643722