Wurde g ++ 4.8 von der PPA heruntergeladen, kann es aber nicht als Standard festgelegt werden?

15

Ich habe g ++ 4.8 unter Ubuntu 12.10 folgendermaßen heruntergeladen:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.8

Aber wenn ich das mache:

sudo update-alternatives --config g++

Um die g ++ Versionen zu wechseln, heißt es:

update-alternatives: error: no alternatives for g++.

Wenn ich jedoch tue:

g++ --version

es sagt:

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Wie kann ich meine g ++ 4.8-Installation als Standard-g ++ festlegen?

user997112
quelle

Antworten:

11

Zunächst müssen Sie herausfinden, wo sich Ihre 4.8-Binärdateien aller Tools befinden:

$ which gcc-4.8
/usr/bin/gcc-4.8
$ which g++-4.8
/usr/bin/g++-4.8
$ ls /usr/bin/*-4.8
/usr/bin/cpp-4.8         /usr/bin/x86_64-linux-gnu-cpp-4.8
/usr/bin/g++-4.8         /usr/bin/x86_64-linux-gnu-g++-4.8
/usr/bin/gcc-4.8         /usr/bin/x86_64-linux-gnu-gcc-4.8
/usr/bin/gcc-ar-4.8      /usr/bin/x86_64-linux-gnu-gcc-ar-4.8
/usr/bin/gcc-nm-4.8      /usr/bin/x86_64-linux-gnu-gcc-nm-4.8
/usr/bin/gcc-ranlib-4.8  /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.8
/usr/bin/gcov-4.8

Wir haben also alle unsere Binärdateien und wollen nun sehen, ob für diese Binärdateien einige Symlinks verfügbar sind:

$ cd /usr/bin
$ ls -l gcc* cpp g++
lrwxrwxrwx 1 root root      7 sep 18 14:02 cpp -> cpp-4.7
lrwxrwxrwx 1 root root      7 abr 22  2013 g++ -> g++-4.7
lrwxrwxrwx 1 root root      7 sep 18 14:02 gcc -> gcc-4.7

Wie wir sehen können, nur cpp, g++und gcchat symbolische Links. Hier haben wir zwei Möglichkeiten.

Symlinking

Wir ersetzen die symbolischen Links durch unsere und entfernen zuerst die tatsächlichen:

sudo rm /usr/bin/cpp /usr/bin/gcc /usr/bin/g++

Dann erschaffe unsere

sudo ln -s /usr/bin/cpp-4.8 /usr/bin/cpp
sudo ln -s /usr/bin/gcc-4.8 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.8 /usr/bin/g++

Verwenden Sie zum Zurücksetzen dieselben Befehle, jedoch mit 4.7 oder 4.6

sudo rm /usr/bin/cpp /usr/bin/gcc /usr/bin/g++
sudo ln -s /usr/bin/cpp-4.7 /usr/bin/cpp
sudo ln -s /usr/bin/gcc-4.7 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.7 /usr/bin/g++
Braiam
quelle
Als ich das getan habe: ls -l gcc * cpp g ++ gab es Folgendes zurück: ls: Kein Zugriff auf gcc *: Keine solche Datei oder Verzeichnis ls: Kein Zugriff auf cpp: Keine solche Datei oder Verzeichnis ls: Kein Zugriff auf g ++: Keine solche Datei oder Verzeichnis
user997112
Keine Entschuldigung erforderlich :) Sobald ich die Entfernungsfunktion aufgerufen habe, funktioniert sie, aber wenn ich "unsere" Symlinks erstelle, heißt es: sudo ln -s -T / usr / bin / cpp /usr/bin/cpp-4.8 ln: fehlgeschlagen um einen symbolischen Link zu erstellen: `/usr/bin/cpp-4.8 ': Datei existiert
user997112
(Ich habe den Befehl rm zweimal aufgerufen, nur um beim zweiten Mal zu bestätigen / zu beanstanden, dass die vorhandenen Links tatsächlich gelöscht wurden)
user997112
3
Das ist eine schreckliche Idee . Es gibt viele Programme, die gcczum Kompilieren von Kernelmodulen verwendet werden, und einige von ihnen (z. B. Nvidia) stürzen im Hintergrund ab, wenn gccsie nicht die Programme aufrufen, mit denen der Kernel kompiliert wurde.
nbubis
1
@nbubis Nun, die Frage ist: "Wie setze ich meine g ++ 4.8-Installation auf die Standardinstallation von g ++?". Man sollte also davon ausgehen, dass jeder, der dies tut, weiß, was er tut, nein? Welche Alternative können Sie dagegen vorschlagen?
Braiam
16

Sie müssen update-alternativeswissen lassen , dass Sie über 2 C ++ - Compiler verfügen, für jeden einen Datensatz erstellen und dann konfigurieren, welchen Sie verwenden möchten. Dies geschieht folgendermaßen:

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6.3 60
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 40
sudo update-alternatives --config g++ 

Ab diesem Zeitpunkt ist zum Wechseln des Compilers nur noch der folgende Befehl erforderlich:

sudo update-alternatives --config g++

Siehe man update-alternativesfür weitere Informationen.

Quelle: Wie benutze ich mehrere Instanzen von gcc?

Radu Rădeanu
quelle
@Braiam Das geht mit jedem Paket genauso.
Radu Rădeanu
3
Kann jemand auf die 60 und 40 eingehen? Ich habe das an vielen Orten gesehen
user997112
@ user997112 Ich schlage vor, Sie lesen den Mann, aber wenn Sie mehr 70 und 30 mögen, dann verwenden Sie 70 und 30 ...
Radu Rădeanu
1
@ user997112 Dies sind Prioritätsnummern, die nur bei Verwendung von --auto relevant sind. Sie können einige Beispiele mitupdate-alternatives --display editor
Braiam
2
Am 12.04 bekomme ich: update-alternatives: error: alternative g ++ kann nicht master sein: es ist ein
sklave
9

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.7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 
sudo update-alternatives --config gcc
Anton K
quelle
Willkommen bei Ask Ubuntu! Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Stormvirux
Du hast recht. Ich habe den wesentlichen Teil hinzugefügt
Anton K
1
Mit diesem Sklavenzeug habe ich meinen Tag gerettet. tx
Lennart Rolland