gcc 4.8をデフォルトのgccコンパイラとして設定する方法


27

gcc 4.8使用brewして最近インストールしましたOSX 10.7.5 (Lion)。私は今を使用gcc 4.8してコンパイルすることができます

g++-4.8 some_file.c

またはを使用してデフォルトgcc 4.2を使用する

g++ some_file.c

端末で入力する場合gcc 4.8Xcodeおよびデフォルトのコンパイラとして使用したいgccgcc-related内のリンクを変更する必要があると思いますdirname $(which gcc)

私がする時

ls -al $(dirname $(which gcc)) | grep 'gcc\|g++\|c++'

私は次を取得します:

lrwxr-xr-x     1 root   wheel         7 Jul 31 12:17 c++ -> clang++
-rwxr-xr-x     1 root   wheel    909360 Nov 18  2011 c++filt
lrwxr-xr-x     1 root   wheel         5 Jul 31 12:17 clang++ -> clang
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 g++ -> llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 gcc -> llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        28 Jul 31 12:17 gcov-4.2 -> ../llvm-gcc-4.2/bin/gcov-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-cpp-4.2 -> ../llvm-gcc-4.2/bin/llvm-cpp-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++ -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2

実行すると:which gcc-4.8が表示されます/usr/local/bin/gcc-4.8

これを実行する手順は非常に役立ちます。

お願いします。


1
優れたllvm clangを使用しない理由は何ですか?
マックスリード

特にありません。バニラgccと比較したllvm clangの利点は何ですか?
クイン

3
より高速でありながら意味のある警告も提供しますが、gccには非常に貴重な機能が完全に欠けています。
マックスリード

そうですか。とclang 3.3同等gcc 4.8ですか?私もできるbrew installと信じています。
クイン

最初の質問は、clangで、なぜgcc-4.8ではなくXcodeで提供されているclangを使用できないのかということです。それからclang3.3の答えが機能します
user151019

回答:


20

bash(デフォルト)を使用している場合、次のようにPATHの最優先事項として/ usr / local / binを追加できます。

echo "PATH=\"/usr/local/bin:$PATH\"" >> ~/.bash_profile

これにより、パスの他のすべての領域の前に/ usr / local / binがチェックされます。次に、新しいターミナルセッションを開始して、新しい変数をロードします。

これを行う別の方法:

  cd /usr/bin
  rm cc gcc c++ g++
  ln -s /usr/local/bin/gcc-4.8 cc
  ln -s /usr/local/bin/gcc-4.8 gcc
  ln -s /usr/local/bin/c++-4.8 c++
  ln -s /usr/local/bin/g++-4.8 g++

私の思考経路にはすでに含まれています usr/local/binecho $PATH明らかに:/ opt / local / bin:/ opt / local / sbin:/ opt / local / include:/ usr / local / mysql / bin:/ usr / bin / bjam:/ usr / bin:/ bin:/ usr / sbinに:/ sbinに:は/ usr / local / binにします。/ usr / X11 / binに:は/ usr / local /行く/ binにします。/ usr / texbin
QUINE

別のオプションを追加
Digitalchild

1
はい、含まれていますが、/ usr / binの後にあるため、最初に読み取られません。PATHはシーケンシャルです。
デジタルチャイルド

1
どちらのオプションも私には機能しないようです。私は移動/usr/local/bin第一中に表示されるようにPATH影響を与えなかった- -呼び出しがgccまだ見てgcc 4.2手動でシンボリックリンクを作成したが、私は新しいターミナルウィンドウを開き、ときに.I g++や(cc|c++|gcc)すべてが見つかりません。奇妙な。あなたの助けをありがとう
QUINE

3
/usr/binUnix(MacOS X)でプレイすることはお勧めしません…次のUnixバージョンsourcesの新しいバージョンのソースに取り組んでいる専門家でない限り。
ダン

19

ご協力いただきありがとうございます。~/.bash_profile次のようにエイリアスを作成しました。

alias gcc='gcc-4.8'
alias cc='gcc-4.8'
alias g++='g++-4.8'
alias c++='c++-4.8'

Lynkenからの回答は非常に役立ちますが、必要に応じて元に戻す方が簡単なので、エイリアスを使用してそれを適合させました。

具体的にPATHは、/usr/local/bin(brewがリンクを配置する場所gcc 4.8)が表示される前に表示されるように設定されている場合/usr/bingccデフォルトでリンクされる場所)、Lykenが提案したリンクを作成すること/usr/local/binは理論的にはうまくいくはずです。実際には、何らかの理由で失敗することはありません。リンカーエラーとエイリアスで失敗すると、その問題を解決する必要なく、そのエラーを回避できます。

エイリアスの他の利点は、homebrewで処理したいものをリンクする必要がなく、gccのバージョンがリンクされているツールと競合する必要がないことです /usr/local


にインストールする新しいバイナリについては、これを変更する必要があります/usr/local/bin/usr/local/binPATH内の位置が不適切なため、他のバイナリがインストールされ、非表示になっている場合もあります。私の答えをもう一度考えてください、それはあなたの本当の問題を一度、正しくそして永遠に攻撃しています。
ダン

右。私は以前にライケンに、私がすべてを変えPATHて置いたと述べました/usr/local/bin。私はあなたの声明が正しいことと私が変更する必要があることを認めますPATHが、(私の場合は-のデフォルトbrewインストールgcc 4.8gcc 4.8デフォルトgccでは2つの間にシンボリックリンクがないので、私はまだ呼び出してもデフォルトでは呼び出しません。上記のように手動で作成する必要がありました。
クイン

私はそれがそれ自身の答えになるほど十分に異なっていると言いたいのですが、あなたの答えを解決済みとしてマークします。
デジタルチャイルド

はい、ライケンに感謝します。システムで許可されたらすぐに行います。
クイン

1
エイリアスも試しましたがgcc、ターミナルから直接実行した場合にのみ正常に動作します。clangまだmakefileを使用している場合、この問題は、でのみ使用可能なコンパイラオプションを使用したときにのみ発見されましたgcc
ティエンドゥ

11

私はgcc-4.8を使用しています:

export CC=/usr/local/bin/gcc

export CXX=/usr/local/bin/g++

export CPP=/usr/local/bin/cpp

export LD=/usr/local/bin/gcc

alias c++=/usr/local/bin/c++

alias g++=/usr/local/bin/g++

alias gcc=/usr/local/bin/gcc

alias cpp=/usr/local/bin/cpp

alias ld=/usr/local/bin/gcc

alias cc=/usr/local/bin/gcc

アップルgccに戻ります。

export CC=/usr/bin/gcc

export CXX=/usr/bin/g++

export CPP=/usr/bin/cpp

export LD=/usr/bin/ld

alias c++=/usr/bin/c++

alias g++=/usr/bin/g++

alias gcc=/usr/bin/gcc

alias cpp=/usr/bin/cpp

alias cc=/usr/bin/gcc

alias ld=/usr/bin/ld

またはファイルに入れてから: source <file>


1

実際のシェルの初期化がを介して行われたと仮定します~/.profile。その後、関連するすべてのバイナリがある/usr/local/bin他のPATHコンポーネントよりも先にそれを変更する必要がありますgcc

このクリーンな変更を実行する方法は次のとおりです。

cd

_shell_init = `egrep '(^ |)PATH' .profile 2> / dev / null`

if ["$ {_ shell_init}" = ""]; それから
    #PATHは.profileで定義されていません
    #PATHの最初の相対的な定義をインストールする
    echo 'PATH = / usr / local / bin:$ {PATH}
export PATH '>>。profile
    。。プロフィール
    exec $ {SHELL}
他に
    #/ usr / local / binの出現箇所をすべて削除します
    #PATHに設定し、他のすべてのコンポーネントの前に挿入します
    sed -E -e '/(^ |)PATH = / s、:/ usr / local / bin ,,' \
        -e '/(^ |)PATH = / s、/ usr / local / bin:,,' \
        -e '/(^ |)PATH = / s ,,&/ usr / local / bin :,' .profile> .profile.new
    mv .profile.new .profile
    。。プロフィール
    exec $ {SHELL}
fi

注意:~/.profile既に構造化されている場合は、正しいシェル定義を適切な場所に合わせるために、このシェルスクリプトを手動で調整する必要があります。


これは間違いなく修正に最適であるPATHため、/usr/local/bin最初に見られます。これにより、今後の頭痛の種を減らすことができます。+1できたらいいのに。ただし、私の問題gccはまだリンクされgcc 4.2ているgcc 4.8ことであり、gcc -> gcc-4.8inにシンボリックリンクがないためではありません/usr/local/bin。スクリプトで更新した後は、inside gccとしてエイリアスを作成gcc-4.8する~/.profileか、シンボリックリンク(ln -s gcc-4.8 gcc)を使用する必要があります。うん?/usr/local/binPATH
クイン

brew正しいシンボリックリンクが追加されなかったことに驚いています。同じテーマでこの答えを読みましたか:apple.stackexchange.com/a/38247/22003
ダン

0

エイリアスを作成するか、異なるgccバイナリにリンクすると、デフォルトのシステムインクルードフォルダの前に独自のインクルードが使用されると想定されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.