web-dev-qa-db-ja.com

デフォルトの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

何か案は?

201
Nils

最初に、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 ++にリンクします。 (1020、および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"
262
hhlp

ターミナルで実行:

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
40
hhlp

これは本当に望ましいですか? gccバージョン間にABIの変更があります。あるバージョン(オペレーティングシステム全体など)で何かをコンパイルしてから、別のバージョンで別のものをコンパイルすると、競合が発生する可能性があります。

たとえば、カーネルモジュールは常に、カーネルのコンパイルに使用されるgccと同じバージョンでコンパイルする必要があります。これを念頭に置いて、/usr/bin/gccとUbuntuのバージョンで使用されているバージョンの間のシンボリックリンクを手動で変更した場合、将来のDKMSビルドモジュールは間違ったgccバージョンを使用する可能性があります。

異なるバージョンのgccを使用してビルドしたい場合は、makescriptを使用しても簡単です。たとえば、gcc環境変数にCCのバージョンを渡すことができます。

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

Makeコマンドでは必要ないかもしれませんが(構成スクリプトは通常それを取り込みます)、それは害はありません。

21
Oli

編集:

これは、次のように、最初にバージョンをインストールしたことを前提としています。

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

半詳細な説明:

  • ls -la/usr/bin /は、/ usr/bin内のすべてのファイルをリストします
  • 次のコマンドに出力をパイプ(送信)します
  • grep -oPは、行ごとの検索正規表現に一致します。 oは、一致した行全体ではなく結果のみを表示します。 Pは、grepにPerl-regexを使用するように指示します。ここでは正規表現には触れません。必要に応じて読み進めてください。
  • xargs簡単に言えば、パイプされた結果を収集し、すべてを最後に送信します。つまり、xargsに続くコマンドに
  • bashまあ、それはbashです。 cフラグは、文字列をコマンドとして使用するように指示します。この例では、最初の(0番目の)引数をスキップすることでxargsから送信された引数をループします。この場合、ループは4.9をスキップします。 0番目の引数は、リンクを変更するためにループで使用されます。
  • ln -s -fsフラグはシンボリックリンクを作成し、fは必要に応じて最初に強制的にリンク解除します。
14
Ale

一方向のアップグレードを検討してください。

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

この場合、aptはリンクスタッフを自動的に処理します。新しいC/C++バージョンはかなり互換性があります。古いものはほとんど必要ありません。

0
Sergei

一時ディレクトリ内のシンボリックリンクはどうですか:

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

0
user643722