Как изменить компилятор 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