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

167

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.

[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 }'
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?

    
Nils 15.02.2011, 16:52

5 Antworten

227

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

Pakete installieren

Es scheint, dass sowohl gcc-4.3 als auch gcc-4.4 nach der Installation installiert sind. Wir können jedoch explizit die folgenden Pakete 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++

Alternativen konfigurieren

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 wechseln mit Skript:

#!/bin/sh

if [ -z "" ]; then
    echo "usage: %pre% version" 1>&2
    exit 1
fi

if [ ! -f "/usr/bin/gcc-" ] || [ ! -f "/usr/bin/g++-" ]; then
    echo "no such version gcc/g++ installed" 1>&2
    exit 1
fi

update-alternatives --set gcc "/usr/bin/gcc-"
update-alternatives --set g++ "/usr/bin/g++-"
    
hhlp 15.02.2011, 20:05
30

Ausführen im Terminal:

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 ist, dass wir einen symbolischen Link vom GCC zu der jeweils gewünschten Version von GCC erstellen 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
  • Also müssen wir 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++
  • Nun, wenn wir die symbolischen Links erneut überprüfen, werden wir GCC & amp; G ++ ist jetzt mit GCC 4.3 und G ++ 4.3 verknüpft:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • Endlich können wir unseren GCC-v nochmal überprüfen und sicherstellen, dass wir die richtige Version verwenden:
gcc -v
g++ -v
    
hhlp 15.02.2011 17:49
19

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 gcc kompiliert werden, die zum Kompilieren des Kernels verwendet wurde. Wenn Sie den Symlink zwischen /usr/bin/gcc und der Version, die in Ihrer Ubuntu-Version verwendet wird, manuell geändert haben, verwenden zukünftige von DKMS erstellte Module möglicherweise die falsche gcc -Version.

Wenn Sie nur Dinge mit einer anderen Version von gcc erstellen möchten, ist das sogar mit Markenzeichen einfach. Beispielsweise können Sie die Version von gcc in der Umgebungsvariable CC übergeben:

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

Sie brauchen es vielleicht nicht beim make-Befehl (bei Skripts konfigurieren Sie es normalerweise), aber es tut nicht weh.

    
Oli 15.02.2011 17:22
10

Bearbeiten:

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

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 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}-
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}-
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
" "/usr/bin/${link}"; done' 4.9
" "/usr/bin/${link}"; done' 4.9

In diesem Beispiel habe ich zu 4.9

gewechselt

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. Fügen Sie einfach echo vor sudo hinzu. Der Vollständigkeit halber stelle ich auch eine Check-Zeile zur Verfügung:

gcc --version

Die Ausgabe von der Überprüfung sollte etwa lauten:

%pre%

Sie können die Version danach mit:

überprüfen %pre%

Halb detaillierte Erklärung:

  • ls -la / usr / bin / listet alle Dateien in / usr / bin auf
  • | pipe (sende) die Ausgabe an den nächsten Befehl
  • grep -oP stimmt mit dem Suchregex pro Zeile überein. o zeigt nur das Ergebnis und nicht die gesamte übereinstimmende Zeile an. 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 nach xargs
  • bash Nun, es ist Bash. Das c -Flag weist es an, die Zeichenfolge als Befehl zu verwenden. In diesem Beispiel werden die von xargs gesendeten Argumente übersprungen, indem das erste (0.) Argument übersprungen wird. In diesem Fall überspringt die Schleife 4.9 . Das 0. Argument wird in der Schleife verwendet, um die Verbindung zu ändern.
  • ln -s -f Das s -Flag stellt eine symbolische Verknüpfung her, f bewirkt, dass die Verknüpfung bei Bedarf zuerst aufgehoben wird.
Ale 15.10.2016 22:52
-1

Betrachten Sie die Einweg-Aktualisierung:

  • 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.

    
Sergei 29.10.2017 21:02

Tags und Links