Як змінити типовий компілятор GCC в Ubuntu?


95

Я встановив gcc-3.3 / g ++ - 3.3 на ubuntu 11.04, який вже має gcc / g ++ - 4.4. Тож у моїй системі доступні як gcc-3.3, так і 4.4. Я можу називати обидва компілятори як хочу. Якщо я просто покличу команду, gccтоді буде викликано gcc-4.4. Щоб викликати gcc-3.3, я повинен скористатися командою gcc-3.3.

Як я можу змінити типовий компілятор як gcc-3.3? Коли я виконую команду, gccвона повинна викликати gcc-3.3, а не gcc-4.4.

Крім того, як я можу змінити змінну CXX у файлі make на gcc-3.3? Я хочу змінити одне загальне глобальне місце в системі замість того, щоб змінювати всі файли make.


2
Для прапора CXX ви можете викликати CXX=gcc-3.3або, export CXX=gcc-3.3але тоді, makeколи ви змінили його глобально, update-alternativesвін вже використовуватиме gcc-3.3, і це не потрібно.
DipSwitch

1
@RoboAlex: знову оновив мою відповідь, щоб врахувати ваш запит змінної середовища CXX. Однак зауважте, що воно буде діяти лише в тому випадку, якщо ви зміните альтернативи оновлення пізніше.
jopasserat

Вам потрібно лише змінити свій ШЛЯХ. У більшості відповідей згадується система альтернатив, але як Debian, так і супровідники LLVM погоджуються, що система альтернатив повинна використовуватися для альтернатив , НЕ для версій . Далі пояснюється у моїй відповіді.
hmijail оплакує відставку

Відповіді:


112

Як запропонував @Tommy, вам слід використовувати update-alternatives.
Він присвоює значення кожному програмному забезпеченню сімейства, таким чином, він визначає порядок виклику програм.

Він використовується для підтримки різних версій одного і того ж програмного забезпечення в системі. У вашому випадку ви зможете скористатися кількома відмінами gcc, а одне буде надавати перевагу.

Щоб з’ясувати поточні пріоритети gcc, введіть команду, вказану коментарем @ tripleee:

update-alternatives --query gcc

Тепер зверніть увагу на пріоритет, якому приписується, gcc-4.4оскільки вам потрібно буде вказати вищий gcc-3.3.
Щоб встановити альтернативи, у вас має бути щось на зразок цього (якщо ваша gccустановка знаходиться за адресою /usr/bin/gcc-3.3, а gcc-4.4пріоритет 'менше 50) :

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 50

--edit--

Нарешті, ви також можете використовувати інтерактивний інтерфейс, update-alternativesщоб легко переключатися між версіями. Введіть, update-alternatives --config gccщоб вам було запропоновано вибрати версію gcc, яку ви хочете використовувати, серед встановлених.

- редагування 2 -

Тепер, щоб виправити змінну середовища CXX по всій системі, вам потрібно поставити рядок, позначений @ DipSwitch's у вашому .bashrcфайлі (це застосовуватиме зміну лише для вашого користувача, що, на мій погляд, безпечніше):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc

1
@thang також зателефонував cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat

Коли я запускаю `` альтернативні варіанти оновлення --config gcc '', нічого не відбувається, хоча у мене є системний gcc та анаконда
Kelthar,

як ти міг це зробити автоматично? для цього потрібен крок вручну для перевірки вихідних даних update-alternatives --query gcc, який може не працювати, наприклад, в автоматизованому сценарії надання. Крім того, як це можна зробити агностичним для платформи?
Елі

68

Ось повний приклад відповіді jHackTheRipper для натовпу TL; DR. :-) У цьому випадку я хотів запустити g ++ - 4.5 в системі Ubuntu, яка за замовчуванням має значення 4.6. Як root:

apt-get install g++-4.5
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.5 50
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 50
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 100
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.5 50
update-alternatives --set g++ /usr/bin/g++-4.5
update-alternatives --set gcc /usr/bin/gcc-4.5
update-alternatives --set cpp-bin /usr/bin/cpp-4.5

Тут за замовчуванням все ще є 4.6 (він же "автоматичний режим"), але я явно переходжу на 4.5 тимчасово (ручний режим). Щоб повернутися до 4.6:

update-alternatives --auto g++
update-alternatives --auto gcc
update-alternatives --auto cpp-bin

(Зверніть увагу на використання cpp-binзамість просто cpp. Ubuntu вже має cppальтернативу з головним посиланням /lib/cpp. Перейменування цього посилання призведе до видалення /lib/cppпосилання, що може порушити сценарії.)


8
Для ледачої людини майбутнього, яка намагається встановити встановлений компілятор g ++ - 5 за замовчуванням:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

Залишається лише 1 питання: чому APT не робить цього при встановленні g++-6пакету?
rustyx

Таким чином я переключив компілятор за замовчуванням на g ++ - 5, але він все ще використовує стандартні бібліотеки g ++ - 7, і тепер я отримую помилки з невизначеними __builtinматеріалами.
Youda008,

22

Це чудовий опис та покрокова інструкція щодо створення та управління альтернативами головного та підлеглого (gcc та g ++).

Незабаром це:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc

що з 40 і 60. Я намагаюся використовувати gcc-6.
nyxee

@nyxee 40 і 60 позначають пріоритет, присвоєний кожному запису, перевіряйте інші відповіді для повнішої повноти теми
jopasserat

10

Між 4,8 і 6 з усіма --slaves:

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 \
                    10 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-4.8 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-4.8 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-4.8 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-4.8 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8

і

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 \
                    15 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-6 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-6 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-6 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-6 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6

Змінюйтесь між ними за допомогою update-alternatives --config gcc.


2
відмінно працює після видалення ccта c++ рядків, які спричиняють помилку: альтернативний cc не може бути веденим gcc: це головна альтернатива
palik

7

Тепер для Ubuntu / точно доступний gcc-4.9.

Створіть групу альтернатив компілятора, де дистрибутивний компілятор має вищий пріоритет:

root$ VER=4.6 ; PRIO=60
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

root$ VER=4.9 ; PRIO=40
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

ПРИМІТКА: версія g ++ змінюється автоматично за допомогою перемикача версії gcc. cpp-bin потрібно робити окремо, оскільки існує основна альтернатива "cpp".

Перелічіть альтернативні варіанти компілятора:

root$ update-alternatives --list gcc
root$ update-alternatives --list cpp-bin

Щоб вибрати версію 4.9 gcc, g ++ та cpp вручну:

root$ update-alternatives --config gcc
root$ update-alternatives --config cpp-bin

Перевірте версії компілятора:

root$ for i in gcc g++ cpp ; do $i --version ; done

Відновіть налаштування компілятора дистрибутива (тут: повернутися до v4.6):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin

2

Я виявив цю проблему під час спроби встановити новий компілятор clang. Виявляється, і Debian, і супроводжуючі LLVM погоджуються, що система альтернатив повинна використовуватися для альтернатив, а не для версій .

Рішення, яке вони пропонують, є приблизно таким:
PATH=/usr/lib/llvm-3.7/bin:$PATH
де /usr/lib/llvm-3.7/bin - це каталог, створений пакетом llvm-3.7, який містить усі інструменти з їх несуфіксованими іменами. При цьому llvm-config (версія 3.7) з’являється зі своїм простим іменем у вашому PATH. Не потрібно мутити символічні посилання, а також не викликати llvm-config-3.7, який було встановлено в / usr / bin.

Крім того, перевірте наявність пакета з назвою llvm-defaults (або gcc-defaults), який може запропонувати інший спосіб зробити це (я його не використовував).


Відмінне рішення! Я використовую його для вибору серед спеціально розроблених "gcc" номерів
Mad Calm

1

Якщо вам потрібен більш швидкий (але все ще дуже чистий) спосіб досягнення цього в особистих цілях (наприклад, якщо ви хочете побудувати конкретний проект, що має деякі суворі вимоги щодо версії компілятора), просто виконайте такі дії:

  • введіть echo $PATHі знайдіть персональний каталог з дуже високим пріоритетом (у моєму випадку я маю ~/.local/bin);
  • додайте символічні посилання в цей каталог:

Наприклад:

ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc
ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++

Звичайно, це буде працювати для одного користувача (це не загальносистемне рішення), але, з іншого боку, я не люблю змінювати занадто багато речей у своїй установці.


Отже, ви створюєте власну спеціальну, паралельну системі альтернативну систему. Чому б не використовувати справжню річ?
hmijail оплакує відставку

@hmijail Як я вже пояснював, я використовую цей спосіб, коли хочу побудувати дуже єдиний проект, не псуючи всю мою інсталяцію. Це працює дуже добре, і я можу легко видалити його після.
Thomas Baruchel

1
Просто змінення PATH було б швидшим, чистішим та синхронізувало б ваші інструменти, пов’язані з gcc.
hmijail оплакує відставку

0

Я використовував лише рядки нижче, і це спрацювало. Я просто хотів , щоб скомпілювати VirtualBoxі VMWare WorkStationвикористовуючи kernel 4.8.10на Ubuntu 14.04. Спочатку більшість речей не працювали, наприклад, графіка та мережа. Мені пощастило, що VMWare workstationпросили gcc 6.2.0. Я не міг запустити свій, Genymotion Android emulatorsоскільки virtualbox не працював. За необхідності опублікує результати пізніше.

VER=4.6 ; PRIO=60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=6 ; PRIO=50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=4.8 ; PRIO=40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.