Завантажено g ++ 4.8 з PPA, але ви не можете встановити його за замовчуванням?


15

Я завантажив g ++ 4.8 на Ubuntu 12.10, виконавши:

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

але коли я це роблю:

sudo update-alternatives --config g++

для переключення версій g ++, він говорить:

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

Однак якщо я це роблю:

g++ --version

він говорить:

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.

Як встановити мою установку g ++ 4.8 за умовчанням g ++?

Відповіді:


11

Перш за все, ви повинні дізнатися, де знаходяться ваші 4,8 двійкових файлів усіх інструментів:

$ 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

Отже, у нас є всі наші двійкові файли, тепер давайте перевіримо, чи є такі символьні посилання для таких бінарних файлів:

$ 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

Як ми можемо бачити, тільки cpp, g++і gccмає символічні посилання. У нас є два варіанти.

Мислення

Ми замінюємо символьні посилання на наші, видаляючи спочатку фактичні:

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

Тоді створюємо своє

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

Щоб повернути його назад, використовуйте ті самі команди, але замість них 4.7 або 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++

Коли я зробив: ls -l gcc * cpp g ++, він повернувся: ls: не може отримати доступ до gcc *: немає такого файлу чи каталогу ls: не може отримати доступ до cpp: немає такого файлу чи каталогу ls: не може отримати доступ g ++: немає такого файлу чи каталогу
user997112

Вибачення не потрібно :) Після того, як я закликаю функцію видалення, вона працює, але коли я переходжу до створення "наших" символів, вона говорить: sudo ln -s -T / usr / bin / cpp /usr/bin/cpp-4.8 ln: не вдалося створити символічне посилання `/usr/bin/cpp-4.8 ': Файл існує
user997112

(Я закликав команду rm двічі просто так, вдруге вона підтвердила / поскаржилася, що існуючі посилання насправді видалені)
user997112

3
Це жахлива ідея . Існує багато програм, які використовують gccдля компіляції модулів ядра, і деякі з них (наприклад, Nvidia) мовчки виходять з ладу, коли gccвиклик не буде тим, з яким було складено ядро.
nbubis

1
@nbubis добре, що питання: "Як встановити мою установку g ++ 4.8 за умовчанням g ++?", тож варто припустити, хто це робить, вони знають, що роблять, ні? З іншого боку, яку альтернативу ви можете запропонувати?
Брайам

16

Вам потрібно повідомити update-alternatives, що у вас є 2 компілятори C ++, створити запис для кожного з них, а потім налаштувати, який саме ви хочете використовувати. Це робиться з наступним:

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

З цього моменту єдине, що потрібно при перемиканні компіляторів - це ця команда:

sudo update-alternatives --config g++

Див. Для man update-alternativesотримання додаткової інформації.

Джерело: Як використовувати кілька примірників gcc?


@Braiam Це можна зробити так само, як і з будь-яким пакетом.
Radu Rădeanu

3
Хтось може детальніше розглянути питання про 60 та 40? Я бачив це в багатьох місцях
user997112

@ user997112 Я пропоную вам прочитати людину, але, якщо вам більше подобається 70 і 30, то використовуйте 70 і 30 ...
Radu Rădeanu

1
@ user997112 це пріоритетні номери, які стосуються лише --auto. ви можете побачити кілька прикладів, використовуючиupdate-alternatives --display editor
Брайам

2
12.04 я отримую: update-alternative: error: альтернатива g ++ не може бути майстром: це раб gcc
rickfoosusa

9

Це чудовий опис та покрокова інструкція, як створити й керувати альтернативою master та slave (gcc та g ++).

Незабаром, це так

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

Ласкаво просимо в Ask Ubuntu! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Stormvirux

Ти маєш рацію. Я додав істотну частину
Антон К

1
Врятував мій день з цими рабськими речами. tx
Lennart Rolland
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.