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

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

[email protected]:~# update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc.
[email protected]:~# update-alternatives --config cc
There is only one alternative in link group cc: /usr/bin/gcc
Nothing to configure.


[email protected]:~# 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

Любые идеи?

166 голосов | спросил Nils 15 FebruaryEurope/MoscowbTue, 15 Feb 2011 18:52:57 +0300000000pmTue, 15 Feb 2011 18:52:57 +030011 2011, 18:52:57

5 ответов


226

Сначала стираются текущие настройки обновлений для 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"
ответил hhlp 15 FebruaryEurope/MoscowbTue, 15 Feb 2011 22:05:55 +0300000000pmTue, 15 Feb 2011 22:05:55 +030011 2011, 22:05:55
30

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

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
ответил hhlp 15 FebruaryEurope/MoscowbTue, 15 Feb 2011 19:49:39 +0300000000pmTue, 15 Feb 2011 19:49:39 +030011 2011, 19:49:39
19

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

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

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

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

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

ответил Oli 15 FebruaryEurope/MoscowbTue, 15 Feb 2011 19:22:37 +0300000000pmTue, 15 Feb 2011 19:22:37 +030011 2011, 19:22:37
10

Edit:

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

sudo apt install gcc-4.9 g++-4.9

Оригинал:

И вот один лайнер для тех, кто ленив, просто измените число в конце на нужную вам версию. Он изменит значение gcc и /или 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

Нет проверок ошибок и что нет в этом примере, поэтому вы можете проверить, что будет выполняться до его запуска. Просто добавьте эхо до sudo . Для полноты я также предоставляю контрольную линию:

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 /bin
  • | (отправьте) вывод следующей команде
  • grep -oP соответствует регулярному выражению поиска в строке. o показывает результат не всей согласованной строки. P сообщает grep использовать perl-regex. Я не буду входить в regex здесь, читать на нем, если вы хотите.
  • xargs , он собирает результаты, которые отправляются на него и отправляют все из них до конца. то есть команде, следующей за xargs
  • bash хорошо, это bash. Флаг c сообщает, что он использует строку в качестве команды. В этом примере он перебирает аргументы, отправленные из xargs , пропуская первый (0-й) аргумент, в этом случае цикл пропускает 4.9 . 0-й аргумент используется в цикле для изменения ссылки.
  • ln -s -f Флаг s создает символическую ссылку, f сначала принудительно отжимает, если необходимо.
ответил Ale 15 +03002016-10-15T23:52:47+03:00312016bEurope/MoscowSat, 15 Oct 2016 23:52:47 +0300 2016, 23:52:47
-1

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

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

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

ответил Sergei 29 +03002017-10-29T23:02:57+03:00312017bEurope/MoscowSun, 29 Oct 2017 23:02:57 +0300 2017, 23:02:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132