Как изменить компилятор 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
-- edit--
наконец, вы также можете использовать интерактивный интерфейс update-alternatives
легко переключаться между версии. Тип update-alternatives --config gcc
чтобы вас попросили выбрать версию gcc, которую вы хотите использовать среди установленных.
-- edit 2 --
теперь, чтобы исправить переменную среды CXX по всей системе, вам нужно поместить строку, указанную @DipSwitch в вашем .bashrc
файл (это будет применять изменение только для вашего пользователя, что, на мой взгляд, безопаснее):
echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc
вот полный пример ответа jHackTheRipper для TL; DR толпы. :- ) В этом случае я хотел запустить g++-4.5 в системе Ubuntu, которая по умолчанию равна 4.6. As 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
. 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
теперь для Ubuntu/precise доступен 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, do:
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
между 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
.
Я нашел эту проблему при попытке установить новый компилятор Clang. Оказывается, что оба Debian и сопровождающие LLVM согласны что альтернативная система должна использоваться для альтернативы, не версионность.
решение, которое они предлагают, примерно таково:PATH=/usr/lib/llvm-3.7/bin:$PATH
где /usr / lib/llvm-3.7 / bin-это каталог, созданный пакетом llvm-3.7 и содержащий все инструменты с суффиксом имен. При этом llvm-config (версия 3.7) появляется с простым именем на вашем пути. Нет необходимости возиться с символическими ссылками или вызывать 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
on 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