Итак, я установил gcc-4.4 и gcc-4.3 (то же самое для g++). Теперь, насколько я помню, в Ubuntu есть инструмент, который устанавливает символические ссылки для вас, если вы просто укажете ему, какую версию вы хотите. Однако, похоже, это не работает в новейшей версии, что я нахожу разочаровывающим.
root@nexus:~# update-alternatives --config gccupdate-alternatives: error: no alternatives for gcc.root@nexus:~# update-alternatives --config ccThere is only one alternative in link group cc: /usr/bin/gccNothing to configure.root@nexus:~# dpkg -l | grep gcc | awk '{print $2}'gccgcc-4.3gcc-4.3-basegcc-4.3-multilibgcc-4.4gcc-4.4-basegcc-4.4-multilibgcc-4.5-basegcc-multiliblib32gcc1libgcc1
Символические ссылки cc и c++ устанавливаются по умолчанию. Мы установим символьные ссылки для gcc и g++, затем свяжите cc и c++ к gcc и g++ соответственно. (Обратите внимание, что 10, 20 и 30 варианты являются приоритетными для каждой альтернативы, где большее число имеет более высокий приоритет.)
Ладно, эта часть довольно проста. Сложность заключается в том, что когда вы выполняете команду GCC, на самом деле это символьная ссылка на ту версию GCC, которую вы используете. Это означает, что мы можем создать символическую ссылку из GCC на любую версию GCC, которую мы захотим.
Действительно ли это желательно? Существуют изменения ABI между gcc версии. Компиляция чего-либо с одной версией (например, всей операционной системы), а затем компиляция чего-либо другого с другой версией может привести к конфликту.
Например, модули ядра всегда должны компилироваться с одной и той же версией gcc используется для компиляции ядра. Имея это в виду, если вы вручную изменили символическую ссылку между /usr/bin/gcc и версия, используемая в вашей версии Ubuntu, будущие модули, встроенные в DKMS, могут использовать неправильную gcc версия.
Если вы просто хотите создавать что-то с другой версией gcc, это достаточно просто, даже с помощью makescripts. Например, вы можете передать версию gcc в CC переменная среды:
CC="gcc-4.5" ./configureCC="gcc-4.5" make
Возможно, вам это не понадобится в команде make (сценарии настройки обычно подключают ее), но это не повредит.
Это предполагает, что вы сначала установили версию, например, с:
sudo apt install gcc-4.9 g++-4.9
Оригинал:
А вот однострочник для тех, кому лень, просто измените номер в конце на нужную вам версию. Это внесет изменения в ссагпз и/или g++
ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9
В этом примере я переключился на 4.9
В этом примере нет проверок на ошибки, а чего нет, поэтому вы можете проверить, что будет запущено, прежде чем запускать его. Просто добавьте эхо до потеть. Для полноты картины я также предоставляю контрольную строку:
ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do echo sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9
ls -la /usr/bin/ перечисляет все файлы в /usr/bin /usr/bin
| передайте (отправьте) выходные данные следующей команде
grep -oP соответствует регулярному выражению поиска для каждой строки. o показывает только результат, а не всю совпадающую строку. P сообщает grep использовать perl-regex. Я не буду здесь вдаваться в регулярные выражения, почитайте об этом, если хотите.
xargs проще говоря, он собирает результаты, которые передаются ему по конвейеру, и отправляет их все в конец. т.е. в команду, следующую за xargs
удар что ж, это баш. То c флаг указывает ему использовать строку в качестве команды. В этом примере он перебирает аргументы, отправленные из xargs пропуская первый (0-й) аргумент, в этом случае цикл пропускается 4.9. 0-й аргумент используется в цикле для изменения ссылки.
ln -s -f То s флаг создает символическую ссылку, f при необходимости сначала отключите соединение.
Как объяснил @Oli, это плохая идея. Список рассылки Debian-devel: “Я не думаю, что для управления версиями следует использовать альтернативные варианты. Например, мы не используем альтернативы ни для gcc, ни для Python.” Re: llvm-defaults vs update alternatives