Как изменить компилятор GCC по умолчанию в Ubuntu?

Я установил 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.

Ответ 1

Как предложил @Tommy, вы должны использовать update-alternatives.
Он присваивает значения каждому программному обеспечению семейства, так что он определяет порядок, в котором будут вызываться приложения.

Он используется для поддержки различных версий одного и того же программного обеспечения в системе. В вашем случае вы сможете использовать несколько declinations 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

- редактировать -

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

- отредактировать 2 -

Теперь, чтобы исправить переменную среды CXX по всей стране, вам нужно поместить строку, указанную @DipSwitch, в ваш файл .bashrc (это применит изменение только для вашего пользователя, что на мой взгляд более безопасно):

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

Ответ 2

Вот полный пример ответа 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, которая может сломать скрипты.)

Ответ 3

Это отличное описание и пошаговая инструкция по созданию и управлению альтернативами master и slave (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

Ответ 4

Теперь для Ubuntu/exact доступен 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

Восстановить настройки компилятора дистрибутива (здесь: назад к версии 4.0):

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

Ответ 5

Между 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.

Ответ 6

Если вам нужен более быстрый (но еще очень чистый) способ его достижения в личных целях (например, если вы хотите создать конкретный проект, имеющий некоторые сильные требования к версии компилятора), просто выполните следующие действия шаги:

  • введите echo $PATH и найдите личный каталог с очень высоким приоритетом (в моем случае у меня есть ~/.local/bin);
  • добавить символические ссылки в этот каталог:

Например:

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

Конечно, это будет работать для одного пользователя (это не системное решение), но, с другой стороны, мне не нравится менять слишком много вещей в моей установке.

Ответ 7

Я нашел эту проблему при попытке установить новый компилятор clang. Оказывается, что Debian и сторонники LLVM согласны, что альтернативная система должна использоваться для альтернатив, а не для версий.

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

Также проверьте пакет с именем llvm-defaults (или gcc-defaults), который может предложить другой способ сделать это (я не использовал его).

Ответ 8

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

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