Итак, я установил 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
Есть идеи?
Сначала удалите текущую настройку вариантов обновления
для 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"
выполнить в терминале:
gcc -v
g++ -v
Хорошо, это довольно простая часть. Сложность заключается в том, что когда вы запускаете команду GCC, на самом деле это символическая ссылка на какую-либо версию GCC, которую вы используете. Это означает, что мы можем создать символическую ссылку из GCC на любую версию GCC, которую захотим.
ls -la / usr / bin | grep gcc-4.4 ls -la / usr / bin | grep g ++ - 4.4
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 ++
ls -la / usr / bin / | grep gcc ls -la / usr / bin / | grep g ++
gcc -v g ++ -v
Как насчет символьной ссылки во временном каталоге:
mkdir x && PATH = $ PWD / x: $ PATH && ln -s / usr / bin / g ++ - 7 $ PWD / х / г ++
Это действительно желательно? Есть изменения 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 (скрипты конфигурации обычно втягивают ее), но это не больно.
Изменить:
Предполагается, что вы сначала установили версию, например:
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
Полудетальное объяснение:
Рассмотрим вариант одностороннего обновления:
sudo apt install gcc-7
sudo apt remove gcc-5
apt будет автоматически обрабатывать ссылки на персонал. Новая версия C / C ++ довольно совместима. Вам вряд ли когда-нибудь понадобится старый.
Я обычно настраиваю также связанные Инструменты 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++