UbuntuでデフォルトのGCCコンパイラを変更するにはどうすればよいですか?


95

すでにgcc / g ++-4.4がインストールされているubuntu 11.04にgcc-3.3 / g ++-3.3をインストールしました。したがって、私のシステムではgcc-3.3と4.4の両方を使用できます。必要に応じて両方のコンパイラを呼び出すことができます。コマンドを呼び出すだけの場合gcc、gcc-4.4が呼び出されます。gcc-3.3を呼び出すには、コマンドを使用する必要がありますgcc-3.3

デフォルトのコンパイラをgcc-3.3に変更するにはどうすればよいですか?コマンドを実行すると、gccgcc-4.4ではなくgcc-3.3が呼び出されます。

さらに、makeファイルの変数CXXをgcc-3.3に変更するにはどうすればよいですか?すべてのmakeファイルを変更するのではなく、システム内の1つの共通のグローバルな場所を変更したいと思います。


2
CXXフラグの場合、CXX=gcc-3.3またはexport CXX=gcc-3.3を呼び出すことができmakeますが、それをグローバルに変更update-alternativesすると、すでにgcc-3.3が使用されているため、これは必要ありません。
DipSwitch、2011年

1
@RoboAlex:CXX環境変数の要求を考慮に入れるために私の回答を再度更新しました。ただし、後でupdate-alternativesを変更する場合にのみ機能することに注意してください。
jopasserat '10 / 10/20

PATHを変更するだけです。回答のほとんどは、代替システムに言及したが、DebianとLLVMのメンテナの両方があることに同意代替のシステムがために使用されるべき代替案、NOTのためのバージョニング。私の答えでさらに説明しました。
hmijailは、

回答:


112

@Tommyが示唆したように、を使用する必要がありますupdate-alternatives
ファミリーのすべてのソフトウェアに値を割り当て、アプリケーションが呼び出される順序を定義します。

システム上で同じソフトウェアの異なるバージョンを維持するために使用されます。あなたの場合、のいくつかの赤緯を使用することができgcc、1つが優先されます。

gccの現在の優先順位を把握するには、@ tripleeeのコメントで指摘されているコマンドを入力します。

update-alternatives --query gcc

ここで、に高い優先度gcc-4.4を与える必要があるため、に起因する優先度に注意してくださいgcc-3.3
代替を設定するには、次のようなものが必要ですgccインストールがにあり、の優先順位が50未満/usr/bin/gcc-3.3であると想定gcc-4.4

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 50

-編集-

最後に、のインタラクティブインターフェイスを使用して、update-alternativesバージョンを簡単に切り替えることもできます。update-alternatives --config gccインストールされているものの中から使用したいgccのバージョンを選択するように要求されるタイプ。

-編集2-

ここで、システム全体でCXX環境変数を修正するには、@ DipSwitchで示された行を.bashrcファイルに追加する必要があります(これは、ユーザーにのみ変更を適用するため、私の意見ではより安全です)。

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc

1
@thangは次のようにも呼ばれccます:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat

'update-alternatives --config gcc'を実行すると、システムのgccとanacondaがあっても何も起こりません
Kelthar

どうすればこれを自動的に行うことができますか?これには、の出力を確認する手動の手順が必要です。これは、update-alternatives --query gccたとえば自動プロビジョニングスクリプトでは機能しない可能性があります。また、これをどのようにしてプラットフォームに依存しないようにすることができますか?
1

68

以下は、TL; DR群衆に対するjHackTheRipperの回答の完全な例です。:-)この場合、デフォルトで4.6に設定されているUbuntuシステムでg ++-4.5を実行したいと思っていました。としてroot

apt-get install g++-4.5
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.5 50
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 50
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 100
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.5 50
update-alternatives --set g++ /usr/bin/g++-4.5
update-alternatives --set gcc /usr/bin/gcc-4.5
update-alternatives --set cpp-bin /usr/bin/cpp-4.5

ここでは、4.6がデフォルト(別名「自動モード」)ですが、明示的に一時的に4.5(手動モード)に切り替えます。4.6に戻るには:

update-alternatives --auto g++
update-alternatives --auto gcc
update-alternatives --auto cpp-bin

(のcpp-bin代わりにの使用に注意してくださいcpp。Ubuntuには既にcppのマスターリンクを持つ代替があり/lib/cppます。そのリンクの名前を変更するとリンクが削除され、/lib/cppスクリプトが破損する可能性があります。)


8
インストールされたg ++-5コンパイラーをデフォルトに設定しようとする将来の怠惰な人のために:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

残る質問は1つだけg++-6です。パッケージをインストールするときに、なぜAPTはこれを行わないのですか?
rustyx

この方法でデフォルトのコンパイラをg ++-5に切り替えましたが、それでもg ++-7標準ライブラリが使用されており、未定義の__builtinものでエラーが発生しています。
Youda008

22

これは、マスターとスレーブ(gccおよびg ++)の代替を作成および管理する方法についての説明とステップバイステップの説明です。

まもなくです:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc

40と60には何がありますか。私はgcc-6を使用しようとしています。
nyxee 2017年

@nyxee 40および60は各エントリに割り当てられた優先度を示します。トピックの詳細については他の回答を確認してください
jopasserat

9

すべてで4.8から6の間--slaves

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 \
                    10 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-4.8 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-4.8 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-4.8 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-4.8 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8

そして

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 \
                    15 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-6 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-6 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-6 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-6 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6

でそれらを切り替えますupdate-alternatives --config gcc


1
ccc++ 行を削除すると正常に動作し、エラーが発生します。代替ccはgccのスレーブにはできません。これはマスター代替です
palik

7

現在、Ubuntu / preciseで使用できるgcc-4.9があります。

distroコンパイラーの優先順位が高いコンパイラーの代替グループを作成します。

root$ VER=4.6 ; PRIO=60
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

root$ VER=4.9 ; PRIO=40
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

注: g ++バージョンは、gccバージョンスイッチで自動的に変更されます。「cpp」マスターの代替が存在するため、cpp-binは個別に実行する必要があります。

利用可能な代替コンパイラのリスト:

root$ update-alternatives --list gcc
root$ update-alternatives --list cpp-bin

gcc、g ++、およびcppのバージョン4.9を手動で選択するには、次のようにします。

root$ update-alternatives --config gcc
root$ update-alternatives --config cpp-bin

コンパイラのバージョンを確認します。

root$ for i in gcc g++ cpp ; do $i --version ; done

ディストリビューションコンパイラの設定を復元します(ここでは、v4.6に戻します)。

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin

2

新しいclangコンパイラをインストールしようとしたときに、この問題が見つかりました。両方のことが判明したのDebianLLVMのメンテナが同意する代替システムがために使用されるべきであることを選択肢、 NOTのためのバージョニング

彼らが提案する解決策は次のようなものです:
PATH=/usr/lib/llvm-3.7/bin:$PATH
/usr/lib/llvm-3.7/binはllvm-3.7パッケージによって作成されたディレクトリであり、接尾辞のない名前のすべてのツールが含まれています。これにより、llvm-config(バージョン3.7)がPATHにプレーン名で表示されます。シンボリックリンクをいじったり、/ usr / binにインストールされたllvm-config-3.7を呼び出したりする必要はありません。

また、llvm-defaults(またはgcc-defaults)という名前のパッケージを確認します。これは、これを行う別の方法を提供している可能性があります(私は使用していません)。


優れたソリューション!私はカスタムビルドの「gcc」スイートの中から選択するためにそれを使用します
Mad Calm

1

個人的な目的でそれを実現するためのより迅速な(ただし非常にクリーンな)方法が必要な場合(たとえば、コンパイラのバージョンに関するいくつかの強い要件を持つ特定のプロジェクトを構築する場合)は、次の手順に従ってください。

  • 優先度が非常に高い個人用ディレクトリを入力echo $PATHして探します(私の場合、私は);~/.local/bin
  • このディレクトリにシンボリックリンクを追加します。

例えば:

ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc
ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++

もちろん、これは1人のユーザーで機能します(システム全体のソリューションではありません)が、一方で、インストールであまりにも多くのことを変更したくありません。


つまり、独自のアドホックでシステムに並列の代替システムを作成することになります。本物を使ってみませんか?
hmijailが辞任者を悼む

@hmijail説明したように、インストール全体を台無しにせずに非常に単一のプロジェクトを構築したい場合は、この方法を使用します。それは非常にうまく機能し、後で簡単に削除できます。
Thomas Baruchel

1
PATHを変更するだけの方が高速でクリーンであり、gcc関連のツールを互いに同期させることができます。
hmijailは、

0

私は下の行だけを使用し、それはうまくいきました。コンパイルしてVirtualBoxVMWare WorkStation使用kernel 4.8.10したかっただけUbuntu 14.04です。最初は、ほとんどのものがグラフィックやネットワークの例では機能していませんでした。幸運VMWare workstationでしたgcc 6.2.0Genymotion Android emulatorsvirtualboxがダウンしていたため、起動できませんでした。必要に応じて後で結果を掲載します。

VER=4.6 ; PRIO=60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=6 ; PRIO=50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=4.8 ; PRIO=40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.