Как изменить компилятор 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.
8 ответов
Как предложил @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
--редактировать--
Наконец, вы также можете использовать интерактивный интерфейс update-alternatives
легко переключаться между версиями. Тип update-alternatives --config gcc
вам будет предложено выбрать версию gcc, которую вы хотите использовать среди установленных.
--edit 2 -
Теперь, чтобы исправить переменную среды CXX в масштабе всей системы, вам нужно поместить строку, обозначенную @DipSwitch's, в ваш .bashrc
файл (это применимо только к вашему пользователю, что на мой взгляд более безопасно):
echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc
Вот полный пример ответа 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
ссылка, которая могла бы сломать скрипты.)
Это отличное описание и пошаговая инструкция по созданию и управлению альтернативами 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.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
,
Теперь для 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 должен выполняться отдельно, так как существует альтернатива master 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
Я обнаружил эту проблему при попытке установить новый компилятор 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), который может предложить другой способ сделать это (я не использовал его).
Если вам нужен более быстрый (но все же очень чистый) способ достижения этого для личных целей (например, если вы хотите создать конкретный проект, имеющий некоторые строгие требования в отношении версии компилятора), просто выполните следующие шаги:
- тип
echo $PATH
и искать личный каталог с очень высоким приоритетом (в моем случае, у меня есть~/.local/bin
); - Добавьте символические ссылки в этот каталог:
Например:
ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc
ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++
Конечно, это будет работать для одного пользователя (это не решение для всей системы), но, с другой стороны, я не люблю менять слишком много вещей в моей установке.
Я использовал только строки ниже, и это сработало. Я просто хотел скомпилировать 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