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

98

Я установил 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, и это не обязательно.
DipSwitch
1
@RoboAlex: снова обновил мой ответ, чтобы учесть ваш запрос переменной среды CXX. Однако обратите внимание, что он будет работать только в том случае, если вы позже измените альтернативы обновления.
jopasserat
Вам нужно только изменить свой PATH. В большинстве ответов упоминается система альтернатив, но сопровождающие Debian и LLVM согласны с тем, что система альтернатив должна использоваться для альтернатив , а НЕ для управления версиями . Далее объяснил в моем ответе.
hmijail оплакивает уволившихся

Ответы:

114

Как предложил @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, которую вы хотите использовать, среди установленных.

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

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

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc
Jopasserat
источник
1
@thang также звонил cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat
Когда я запускаю 'update-alternatives --config gcc', ничего не происходит, хотя у меня есть системный gcc и anaconda one
Kelthar
Но как вы могли сделать это автоматически? это требует ручного шага для проверки вывода update-alternatives --query gcc, который может не работать, например, в сценарии автоматической подготовки. Кроме того, как сделать это независимым от платформы?
Эли
70

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

Тревор Робинсон
источник
8
Для ленивых людей будущего, пытающихся установить установленный компилятор g ++ - 5 по умолчанию:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett
Остается только один вопрос: почему APT не делает этого при установке g++-6пакета?
rustyx
Я переключил компилятор по умолчанию на g ++ - 5 таким образом, но он по-прежнему использует стандартные библиотеки g ++ - 7, и теперь я получаю ошибки с неопределенным __builtinматериалом.
Youda008
23

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

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

szotsaki'gofundme-DefendFromSO
источник
2
работает отлично после удаления ccи c++ линий, которые ошибка причины: альтернативный куб.см не может быть рабом НКУ: это мастер альтернатива
palik
7

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

Перечислите доступные альтернативы компилятора:

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
дилекс
источник
2

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

hmijail оплакивает отставных
источник
Отличное решение! Я использую его для выбора среди специально созданных люксов "gcc"
Mad Calm,
1

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

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

Например:

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

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

Томас Баручель
источник
Итак, вы создаете свою собственную специальную, параллельную системе альтернативную систему. Почему бы не использовать настоящую вещь?
hmijail оплакивает уволенных
@hmijail Как я уже объяснил, я использую этот способ, когда хочу создать один-единственный проект, не испортив всю установку. Он работает очень хорошо, и я могу легко удалить его после.
Thomas Baruchel
1
Простое изменение PATH будет быстрее, чище и обеспечит синхронизацию инструментов, связанных с gcc, друг с другом.
Хмиджайл оплакивает уволенных
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
nyxee
источник