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

75

Я установил 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, и в этом нет необходимости.
  • 1
    @RoboAlex: обновил мой ответ еще раз, чтобы учесть запрос переменной среды CXX. Тем не менее, обратите внимание, что он будет работать только в том случае, если вы позже измените варианты обновления.
Показать ещё 1 комментарий
Теги:
gcc

8 ответов

88
Лучший ответ

Как предложил @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
  • 4
    ошибка: нет альтернатив для gcc
  • 1
    @thang также называется cc : root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
57

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

  • 6
    Для ленивых из будущего, пытающихся установить установленный компилятор g ++ - 5 по умолчанию: sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
  • 0
    Остается только один вопрос: почему APT не сделает этого при установке пакета g++-6 ?
14

Это отличное описание и пошаговая инструкция по созданию и управлению альтернативами 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
  • 0
    что с 40 и 60. Я пытаюсь использовать GCC-6.
  • 0
    @nyxee 40 и 60 обозначают приоритет, назначенный каждой записи, проверьте другие ответы для большей полноты темы
5

Теперь для 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
1

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

  • 1
    работает нормально после удаления строк cc и c++ , что приводит к ошибке: альтернатива cc не может быть подчиненной gcc: это альтернатива master
0

Я использовал только строки ниже, и это сработало. Я просто хотел скомпилировать 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
0

Я нашел эту проблему при попытке установить новый компилятор 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), который может предложить другой способ сделать это (я не использовал его).

0

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

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

Например:

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

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

  • 0
    Таким образом, вы создаете свою собственную систему альтернатив, параллельную системе. Почему бы не использовать реальную вещь?
  • 0
    @hmijail Как я уже объяснил, я использую этот способ, когда хочу создать очень отдельный проект, не испортив всю мою установку. Это работает очень хорошо, и я могу легко удалить его после.
Показать ещё 1 комментарий
Сообщество Overcoder
Наверх
Меню