it-swarm-eu.dev

Jak zvolit výchozí verzi gcc a g ++?

Nainstaloval jsem tedy gcc-4.4 a gcc-4.3 (stejné pro g ++). Nyní, pokud si pamatuji, existuje v Ubuntu nástroj, který pro vás nastaví odkazy, pokud mu jen řeknete, kterou verzi chcete. Nezdá se však, že by fungoval v nejnovější verzi, která je pro mě zklamáním.

[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

Nějaké nápady?

225
Nils

Nejprve smažte aktuální update-alternatives nastavení pro gcc a g++:

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

Instalovat balíčky

Zdá se, že obě gcc-4.3 a gcc-4.4 jsou nainstalovány po instalaci build-essential. Můžeme však explicitně nainstalovat následující balíčky:

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

Instalace alternativ

Symbolické odkazy cc and c++ jsou standardně nainstalovány. Nainstalujeme odkazy na symboly pro gcc a g++, poté propojte cc a c++gcc a g++. (Všimněte si, že 10, 20 a 30 možnosti jsou priority pro každou alternativu, kde větší počet je vyšší prioritou.)

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++

Konfigurovat alternativy

Posledním krokem je konfigurace výchozích příkazů pro gcc, g++. Interaktivní přepínání mezi 4,3 a 4,4 je snadné:

Sudo update-alternatives --config gcc
Sudo update-alternatives --config g++

Nebo přepněte pomocí skriptu:

#!/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"
298
hhlp

provést v terminálu:

gcc -v
g++ -v

Dobře, takže ta část je celkem jednoduchá. Triková část je, že když zadáte příkaz GCC, jedná se vlastně o sybolický odkaz, na který kdykoli používáte verzi GCC. To znamená, že můžeme vytvořit symbolický odkaz z GCC na kteroukoli verzi GCC, kterou chceme.

  • Můžete vidět symbolický odkaz:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • Musíme tedy odebrat symbolický odkaz GCC a G ++ a poté je znovu vytvořit propojené s GCC 4.3 a 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++
  • Nyní, pokud znovu zkontrolujeme symbolické odkazy, uvidíme, že GCC & G ++ jsou nyní propojeny s GCC 4.3 a G ++ 4.3:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • Nakonec můžeme znovu zkontrolovat GCC -v a ujistit se, že používáme správnou verzi:
gcc -v
g++ -v
46
hhlp

Je to opravdu žádoucí? Mezi verzemi gcc existují změny ABI. Kompilace něčeho s jednou verzí (např. Celý operační systém) a pak kompilace něčeho jiného s jinou verzí může způsobit konflikt.

Například moduly jádra by měly být vždy kompilovány se stejnou verzí gcc používanou k kompilaci jádra. S ohledem na to, pokud jste ručně změnili symbolický odkaz mezi /usr/bin/gcc a verzi používanou ve vaší verzi Ubuntu, budoucí moduly postavené na DKMS mohou používat nesprávnou verzi gcc.

Pokud chcete jen stavět věci s jinou verzí gcc, je to dost snadné, dokonce i s použitím skriptů. Například můžete předat verzi gcc v proměnné prostředí CC:

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

Možná to nebudete potřebovat v příkazu make (nakonfigurujte skripty, které jej obvykle stahují), ale neublíží to.

21
Oli

pravit:

Předpokládá se, že jste nainstalovali verzi jako první, např .:

Sudo apt install gcc-4.9 g++-4.9

Originál:

A tady je jednodílný pro ty, kdo jsou líní, stačí změnit číslo na konci na verzi, kterou chcete. Provede změnu pro gcc a/nebo 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

V tomto příkladu jsem přešel na 4,9

Neexistují žádné kontroly chyb a co ne v tomto příkladu, takže možná budete chtít zkontrolovat, co bude spuštěno, než jej spustíte. Stačí přidat echo před Sudo. Pro úplnost poskytuji také kontrolní řádek:

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

Výstupem kontroly by mělo být něco jako:

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

Verze můžete zkontrolovat poté pomocí:

gcc --version

Polopodrobné vysvětlení:

  • ls -la/usr/bin / vypíše všechny soubory v / usr/bin
  • pipe (send) output to next command
  • grep -oP odpovídá vyhledávacímu regexu na řádek. o zobrazuje pouze výsledek, ne celou odpovídající řádku. P říká grep, aby používal Perl-regex. Nebudu zde chodit do regexu, přečtěte si to, pokud chcete.
  • xargs Jednoduše řečeno, shromažďuje výsledky, které jsou k němu připojeny, a všechny je posílá na konec. tj. na příkaz následující po xargs
  • bash no, je to bash. Příznak c říká, aby řetězec používal jako příkaz. V tomto příkladu opakuje argumenty odeslané z xargs přeskočením prvního (0.) argumentu, v tomto případě smyčka přeskočí 4.9. 0. argument se používá ve smyčce ke změně odkazu.
  • ln -s -f Příznak s vytvoří symbolické spojení, f vynutí odpojení nejprve, pokud je to potřeba.
16
Ale

A co symbolický odkaz v dočasném adresáři:

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

1
user643722

Obvykle konfiguruji také související nástroje gcc (gcc-ar, ...) jako otroky, takže je můžete všechny přepínat najednou:

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

Poté vyberte výchozí:

Sudo update-alternatives --config gcc
Sudo update-alternatives --config g++
1
Martin Flaska

Zvažte jednosměrnou aktualizaci:

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

apt bude v tomto případě automaticky obsluhovat pracovníky odkazů. Nová verze C/C++ je docela kompatibilní. Sotva byste potřebovali ten starý.

0
Sergei