Вопрос: Как выбрать версию gcc и g ++ по умолчанию?


Поэтому я установил gcc-4.4 и gcc-4.3 (то же самое для g ++). Теперь, насколько я помню, в Ubuntu есть инструмент, который устанавливает символические ссылки для вас, если вы просто скажете, какую версию вы хотите. Однако, похоже, он не работает в новейшей версии, что я считаю неутешительным.

root@nexus:~# update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc.
root@nexus:~# update-alternatives --config cc
There is only one alternative in link group cc: /usr/bin/gcc
Nothing to configure.


root@nexus:~# dpkg -l | grep gcc | awk '{print $2}'
gcc
gcc-4.3
gcc-4.3-base
gcc-4.3-multilib
gcc-4.4
gcc-4.4-base
gcc-4.4-multilib
gcc-4.5-base
gcc-multilib
lib32gcc1
libgcc1

Есть идеи?


167
2018-02-15 15:52


Источник


Как объяснил @Oli, это плохая идея. Список рассылки Debian-devel: «Я не думаю, что альтернативы следует использовать для управления версиями. Например, мы не используем альтернативы для gcc, ни для Python». lists.debian.org/debian-devel/2014/06/msg00381.html - hmijail


Ответы:


Сначала удалили текущую настройку обновлений для gcc и g ++:

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++

Установить пакеты

Похоже, что gcc-4.3 и gcc-4.4 установлены после установки build-essential. Однако мы можем явно установить следующие пакеты:

sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4

Установка альтернатив

Символьные ссылки cc и c ++ устанавливаются по умолчанию. Мы установим символьные ссылки для gcc и g ++, затем свяжем cc и c ++ с gcc и g ++ соответственно.

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc

sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++

Настройка альтернатив

Последний шаг - настройка команд по умолчанию для gcc, g ++. Легко переключаться между 4.3 и 4.4 в интерактивном режиме:

sudo update-alternatives --config gcc
sudo update-alternatives --config g++

Или переключитесь с помощью скрипта:

#!/bin/sh

if [ -z "$1" ]; then
    echo "usage: $0 version" 1>&2
    exit 1
fi

if [ ! -f "/usr/bin/gcc-$1" ] || [ ! -f "/usr/bin/g++-$1" ]; then
    echo "no such version gcc/g++ installed" 1>&2
    exit 1
fi

update-alternatives --set gcc "/usr/bin/gcc-$1"
update-alternatives --set g++ "/usr/bin/g++-$1"

226
2018-02-15 19:05



Thx, поэтому вы должны добавить их вручную для альтернативных вариантов обновления. Раньше версии URC UCuntu сделали это автоматически. - Nils
Это особенно полезно для меня при компиляции модулей nvidia для разных ядер. Большое вам спасибо за объяснение альтернатив обновления - earthmeLon
Спасибо! Я использовал ваш другой ответ для обновления с 4.6 до 4.7. Я хотел использовать этот ответ, но я не был уверен, почему вы добавляете цифры, как 10 20 30 после некоторых из ваших команд. Не могли бы вы объяснить? - Martin Drozdik
Цифры являются приоритетами, как выясняется, согласно man-странице. Я предполагаю, что в случае, если одна из версий будет удалена, она будет использовать эти приоритеты, чтобы определить, какой из них должен стать новым значением по умолчанию. - Ibrahim
@Ibrahim: Нет, они определяют, что выбирается, когда вы выбираете автоматический режим - Cookie


выполнить в терминале:

gcc -v
g++ -v

Хорошо, так что эта часть довольно проста. Сложная часть заключается в том, что когда вы выдаете команду GCC, это на самом деле сиболическая ссылка, к которой вы когда-либо использовали GCC. Это означает, что мы можем создать символическую ссылку от GCC на любую версию GCC, которую мы хотим.

  • Вы можете увидеть символическую ссылку:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • Итак, нам нужно удалить символическую ссылку GCC и символическую ссылку G ++, а затем воссоздать их, связанные с GCC 4.3 и G ++ 4.3:
rm /usr/bin/gcc
rm /usr/bin/g++

ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
ln -s /usr/bin/g++-4.3 /usr/bin/g++
  • Теперь, если мы снова проверим символические ссылки, мы увидим, что GCC & G ++ теперь связаны с GCC 4.3 и G ++ 4.3:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • Наконец, мы снова можем проверить наш GCC -v и убедиться, что мы используем правильную версию:
gcc -v
g++ -v

30
2018-02-15 16:49





Это действительно желательно? Существуют изменения ABI между gcc версии. Компиляция чего-либо с одной версией (например, всей операционной системы), а затем компиляция чего-то другого с другой версией может привести к конфликту.

Например, модули ядра всегда должны быть скомпилированы с той же версией gcc используется для компиляции ядра. Имея это в виду, если вы вручную изменили символическую связь между /usr/bin/gcc и версия, используемая в вашей версии Ubuntu, будущие модули DKMS могут использовать неправильные gcc версия.

Если вы просто хотите построить вещи с другой версией gcc, это достаточно легко, даже с помощью скриптов. Например, вы можете перейти в версию gcc в CC переменная среды:

CC="gcc-4.5" ./configure
CC="gcc-4.5" make

Вам может не понадобиться это в команде make (обычно настраивать скрипты), но это не повредит.


19
2018-02-15 16:22



Thx для вашего комментария. Я знаю переменную CC, но это был не вопрос. - Nils
Правда, но я объяснил, почему gcc не является частью alternatives и почему это не особенно желательно. Если ни один из них не передумает, просто сделайте это вручную. - Oli♦
Это было раньше? Теперь они просто удалили его ?! Компиляция (пользовательское) программное обеспечение с различными версиями gcc должна быть в порядке. В этом обсуждении возникает вопрос ... - Nils
Можете ли вы объяснить, почему переменные окружения для каждого вызова предпочтительнее общесистемного параметра конфигурации? $ sudo apt-get install gcc-6 gcc-7 $ CC="gcc-7" ./configure <much output> $ make # uses gcc-7 В то время как sudo update-alternatives gcc gcc-7 были бы уверены, что вы случайно не переключите ABI. - kfsone


Редактировать:

Предполагается, что вы сначала установили версию, например:

sudo apt install gcc-4.9 g++-4.9

Оригинал:

И вот один лайнер для тех, кто ленив, просто измените номер в конце на нужную вам версию. Он внесет изменения для НКУ и / или г ++

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

Результат проверки должен выглядеть примерно так:

sudo ln -s -f /usr/bin/g++-4.9 /usr/bin/g++
sudo ln -s -f /usr/bin/gcc-4.9 /usr/bin/gcc
sudo ln -s -f /usr/bin/gcc-ar-4.9 /usr/bin/gcc-ar
sudo ln -s -f /usr/bin/gcc-nm-4.9 /usr/bin/gcc-nm
sudo ln -s -f /usr/bin/gcc-ranlib-4.9 /usr/bin/gcc-ranlib
sudo ln -s -f /usr/bin/x86_64-linux-gnu-g++-4.9 /usr/bin/x86_64-linux-gnu-g++
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-4.9 /usr/bin/x86_64-linux-gnu-gcc
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ar-4.9 /usr/bin/x86_64-linux-gnu-gcc-ar
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-nm-4.9 /usr/bin/x86_64-linux-gnu-gcc-nm
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.9 /usr/bin/x86_64-linux-gnu-gcc-ranlib

Вы можете проверить версию после:

gcc --version

Полу-подробное объяснение:

  • ls -la / usr / bin / перечисляет все файлы в / USR / бен
  • | pipe (отправить) вывод следующей команде
  • grep -oP соответствует регулярному выражению поиска в строке. о только показывает результат не всей согласованной строки. п говорит grep использовать perl-regex. Я не буду входить в regex здесь, прочитайте, если хотите.
  • xargs просто ставьте, он собирает результаты, которые передаются на него и отправляют все до конца. т. е. команде, следующей за xargs
  • удар ну, это баш. с флаг сообщает ему использовать строку в качестве команды. В этом примере он перебирает аргументы, отправленные из xargs  пропуская первый (0-й) аргумент, в этом случае цикл пропускает 4,9, 0-й аргумент используется в цикле для изменения ссылки.
  • ln -s -f  s флаг делает символическую ссылку, е сначала при необходимости отжимается.

10
2017-10-15 20:52



Очень старый вопрос, но этот ответ кажется одним из драгоценных камней, которые мы должны искать при рассмотрении ответов на старые сообщения ... - mook765
Brilliant! Лучший ответ раздаст! - Gabriel Staples


Рассмотрим одностороннее обновление:

  • sudo apt install gcc-7
  • sudo apt remove gcc-5

В этом случае apt автоматически обработает ссылки сотрудников. Новая версия C / C ++ довольно совместима. Тебе вряд ли понадобится старый.


-1
2017-10-29 20:02