【Mac】gcc,g++のバージョン8をHomebrewで更新してもXcodeのコンパイラが呼ばれる

環境設定
geralt / Pixabay

競技プログラミングでbits/stdc++.hというヘッダを使いたかったが、XcodeのCommand Line Toolsでは使えないようなので、Homebrewでインストールすることにした。

Homebrewでインストール

$ brew install gcc

しかし、これで#include<bits/stdc++.h> としてもエラーになった。

gccのバージョンを確認してみると、Command Line Toolsのgccを使用しているようで、Homebrew経由の新しいバージョン8を使えていなかった模様。

> gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.2)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

gcc, g++をHomebrewを使って更新したは良いが、Xcodeのコンパイラが呼ばれてしまったのだ。

対応1:シンボリックリンクを貼る

Homebrew経由で入れたパッケージは/usr/local/Celler/ に保存され、/usr/local/bin/ にコマンドのエイリアスが自動で貼られる。

このエイリアスにシンボリックリンクを貼ってやらないと、gcc, g++がうまく使えない。

なのでまずは/usr/local/bin/ からエイリアスを探し当てる。

$ ls /usr/local/bin | grep gcc
$ ls /usr/local/bin | grep g++

次に、見つかったエイリアスに対してシンボリックリンクを貼る。

$ ln -s /usr/local/bin/gcc-8 /usr/local/bin/gcc
$ ln -s /usr/local/bin/g++-8 /usr/local/bin/g++

シンボリックリンクの必要性

パスが通ったディレクトリである/user/local/bin 以下に、gcc, g++という名前のシンボリックリンクを貼ることにより、新しく導入したgccコマンドを使えるようになる。

つまり、シェルが/user/local/bin というパスの通ったディレクトリ内でgccとg++というコマンドを探すと、/user/local/bin/gcc と/user/local/bin/g++ というシンボリックリンクを見つけてくれる。

つまり、

/usr/local/bin/gcc -> /usr/local/bin/gcc-8

などのようにリンクをたどると、Homebrew経由で入れたgcc-8とg++-8が見つかるということだ。

因みにHomebrew経由で入れたこれらはエイリアスなので、以下のように最終的にはまた別のファイルを参照することになる。

/usr/local/bin/gcc-8 -> ../Cellar/gcc/8.2.0/bin/gcc-8

もしかしたらの注意

環境によっては、これでもまだCommand Line Toolsのコンパイラが呼び出されるかもしれない。

その場合は、~/.bash_profile の適当なところに以下の記述をして、最優先のパスを通す必要がある。

export PATH=/usr/local/bin:$PATH

対策2:g++-8を使う

先程はパスの通っているところにシンボリックリンクを貼ることで、g++というコマンドでg++-8をつかうことができた。

別にそこまで良く使わないのならば、g++-8 というコマンドを使うことで、Homebrewからインストールしたコンパイラを呼び出すことができる。

bits/stdc++.hについて

libstdc++: stdc++.h Source File

詳細なコードは上のページを参照のこと。

以下のサイトを見ると、gcc, g++はバージョン8になったので、c++17のほとんどの機能を使えるらしい。

コンパイラの実装状況 - cpprefjp C++日本語リファレンス
コンパイラの実装状況 このページでは、C++のバージョンごとの言語機能を、どのコンパイラがどのバージョンからサポートしているかをまとめる。 ライブラリ機能については、本サイトのリファレンスで各機能を参照してもらいたい。 C++11 C++14 C++17 C++20 C++11言語機能の実装状況 言語機能 説...

しかし、競プロ自体がバージョン5あたりまでしか対応していないので、それらの機能を使うことはほとんどないだろう。

なのでgcc5を入れ直してみました↓

【Mac】競プロ用にgcc, g++ をバージョン5にしてみた話
前回の続き Homebrewで最新版のgccをインストールしたは良いが、普段競プロで使うのはgccのバージョン5までなので、こちらを新しくインストールし直した。 gcc5のインストール $ brew tap homebre...

コメント