そこで、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++
パッケージのインストール
Build-essentialのインストール後に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
これは本当に望ましいですか? gcc
バージョン間にABIの変更があります。あるバージョン(オペレーティングシステム全体など)で何かをコンパイルしてから、別のバージョンで別のものをコンパイルすると、競合が発生する可能性があります。
たとえば、カーネルモジュールは常に、カーネルのコンパイルに使用されるgcc
と同じバージョンでコンパイルする必要があります。これを念頭に置いて、/usr/bin/gcc
とUbuntuのバージョンで使用されているバージョンの間のシンボリックリンクを手動で変更した場合、将来のDKMSビルドモジュールは間違ったgcc
バージョンを使用する可能性があります。
異なるバージョンのgcc
を使用してビルドしたい場合は、makescriptを使用しても簡単です。たとえば、gcc
環境変数にCC
のバージョンを渡すことができます。
CC="gcc-4.5" ./configure
CC="gcc-4.5" make
Makeコマンドでは必要ないかもしれませんが(構成スクリプトは通常それを取り込みます)、それは害はありません。
編集:
これは、次のように、最初にバージョンをインストールしたことを前提としています。
Sudo apt install gcc-4.9 g++-4.9
オリジナル:
そして、ここに怠zyな人のためのワンライナーがあります、あなたが望むバージョンに最後に番号を変更してください。 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の前にechoを追加するだけです。完全を期すために、チェック行も提供します。
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++バージョンはかなり互換性があります。古いものはほとんど必要ありません。
一時ディレクトリ内のシンボリックリンクはどうですか:
mkdir x && PATH=$PWD/x:$PATH && ln -s /usr/bin/g++-7 $PWD/x/g++