Как выбрать версию 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

Есть идеи?

255
задан 30 May 2018 в 11:59

7 ответов

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

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

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

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

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

Альтернативы установки

Символические ссылки cc и c ++ устанавливаются по умолчанию. Мы установим символьные ссылки для gcc и g ++ , затем свяжем cc и c ++ на gcc и ] g ++ соответственно. (Обратите внимание, что параметры 10 , 20 и 30 являются приоритетами для каждой альтернативы, где большее число - более высокий приоритет.)

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"
324
ответ дан 30 May 2018 в 11:59

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

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
 
50
ответ дан 30 May 2018 в 11:59

Как насчет символьной ссылки во временном каталоге:

mkdir x && PATH = $ PWD / x: $ PATH && ln -s / usr / bin / g ++ - 7 $ PWD / х / г ++

1
ответ дан 30 May 2018 в 11:59

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

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

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

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

Она может вам не понадобиться в команде make (скрипты конфигурации обычно втягивают ее), но это не больно.

22
ответ дан 30 May 2018 в 11:59

Изменить:

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

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

В этом примере нет проверок ошибок и того, чего нет, поэтому вы можете захотеть проверьте, что будет запускаться, прежде чем запускать его. Просто добавьте echo перед 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. Я не буду здесь вдаваться в регулярное выражение, почитайте его, если хотите.
  • xargs проще говоря, он собирает результаты, которые передаются по конвейеру, и отправляет их все в конец. т.е. команде, следующей за xargs
  • bash ну, это bash. Флаг c указывает ему использовать строку в качестве команды. В этом примере он перебирает аргументы, отправленные из xargs , пропуская первый (0-й) аргумент, в этом случае цикл пропускает 4.9 . 0-й аргумент используется в цикле для изменения ссылки.
  • ln -s -f Флаг s создает символьную ссылку, f при необходимости заставляет сначала отсоединить ссылку. .
17
ответ дан 30 May 2018 в 11:59

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

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

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

0
ответ дан 30 May 2018 в 11:59

Я обычно настраиваю также связанные Инструменты gcc ( gcc-ar , ...) в качестве подчиненных, поэтому вы можете переключить их все сразу:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10 \
    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.3 \
    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.3 \
    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.3

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20 \
    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.4 \
    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.4 \
    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.4
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 --config gcc
sudo update-alternatives --config g++
2
ответ дан 5 January 2021 в 23:55

Другие вопросы по тегам:

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