macOSでgccを使う
macOSでGNUのgcc
を実行する方法を記します。例では、gcc-10
を使っていますが、どのバージョンも考え方は同じです。
macOSの初期状態で、gcc
やg++
を使うと、本来のgcc
ではなくclang
というコンパイラが実行されます。しかし、それでは困る場合があると思います。
ターミナルで、次のように実行していけば、本来のgcc
が実行できますが、この書き方は意地が悪いので、よく分からない場合はここを一旦読み飛ばしてください。記事の最後に解説を書きました(「冒頭のコマンドの解説」)。
追記(2023-05-17):gcc-13
が配布されました。バージョンの指定が面倒な場合、次のようにブレース展開を使ってもいいと思います。
$ brew install gcc
$ which gcc-{1..100}
/usr/local/bin/gcc-10.2.0.mojave.bottle.ta
Already downloaded: /Users/hase/Library/Caches/Homebrew/downloads/9848634721d3936c7501b4539c138aa1e1f3fb5884f9bf8ab4aa39660f735a66--gcc-10.2.0.mojave.bottle.tar.gz
==> Pouring gcc-10.2.0.mojave.bottle.tar.gz
🍺 /usr/local/Cellar/gcc/10.2.0: 1,465 files, 343MB
brew
でアプリケーションをインストールすると、/usr/local/bin/
にシンボリックリンクが置かれることでパスが通ります。
実行結果の最終行を見ると、実体のインストール先(/usr/local/Cellar/gcc/10.2.0
)が分かるので確認してみます。
$ ls -F /usr/local/Cellar/gcc/10.2.0/
COPYING INSTALL_RECEIPT.json README include/ libexec/
ChangeLog NEWS bin/ lib/ share/
なお、ls
に付けられた-F
オプションは、ファイル名の末にファイルタイプを表示します。/
がディレクトリ、*
が実行ファイル、@
がシンボリックリンクです。
この中のbin
(Binary code)ディレクトリに実行ファイルが格納されているので、またls
で確認してみます。このうち、gcc-10
とg++-10
がよく使われるものだと思われます。というか、他のファイルがなんなのかよく分かっていないです。
$ ls -F /usr/local/Cellar/gcc/10.2.0/bin
c++-10* gfortran-10*
cpp-10* lto-dump-10*
g++-10* x86_64-apple-darwin18-c++-10*
gcc-10* x86_64-apple-darwin18-g++-10*
gcc-ar-10* x86_64-apple-darwin18-gcc-10*
gcc-nm-10* x86_64-apple-darwin18-gcc-10.2.0*
gcc-ranlib-10* x86_64-apple-darwin18-gcc-ar-10*
gcov-10* x86_64-apple-darwin18-gcc-nm-10*
gcov-dump-10* x86_64-apple-darwin18-gcc-ranlib-10*
gcov-tool-10* x86_64-apple-darwin18-gfortran-10*
gfortran@
シンボリックリンクも確認してみます。このパスは、後述するaslia
でも利用します(必須ではありません)。
$ ls -F /usr/local/bin/g*10
/usr/local/bin/g++-10@ /usr/local/bin/gcov-10@
/usr/local/bin/gcc-10@ /usr/local/bin/gcov-dump-10@
/usr/local/bin/gcc-ar-10@ /usr/local/bin/gcov-tool-10@
/usr/local/bin/gcc-nm-10@ /usr/local/bin/gfortran-10@
/usr/local/bin/gcc-ranlib-10@
gcc
をインストールしたので、早速実行してみましょう。あれ、なぜかclang
が実行されてしいました。
$ gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
さっき確認したファイル名を思い出してみます。インストールした実行ファイル名は、gcc
ではなくgcc-10
です。ということは、gcc-10
と入力すれば、本来のgcc
が実行されます。しかし、これではちょっと使いにくいので、gcc
で実行できるようエイリアスを設定します。
$ gcc-10 --version
gcc-10 (Homebrew GCC 10.2.0) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
aliasを設定する
.bashrcにgcc
のエイリアスを設定します。前項で確認したシンボリックリンクのパスを記述しますが、実体のパスやコマンドでも問題ないので、好きに書いてください。
$ vi ~/.bashrc
alias gcc='/usr/local/bin/gcc-10'
alias g++='/usr/local/bin/g++-10'
# シンプルにこうでもいいです
#alias gcc='gcc-10'
#alias g++='g++-10'
記述後、~/.bashrcを読み込んでエイリアスを有効にします。
$ . .bashrc
これで、本来のgccが使えるようになったと思います。もし、上手く行かない場合は、インストールが成功しているのか、実体があるか、エイリアスが設定されているか、設定は読み込まれているのか、などを一つずつ確認してください。
$ gcc --version
gcc-10 (Homebrew GCC 10.2.0) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
gcc
のバージョンが変わった場合は、エイリアスも変更してください(数字を変えるだけでいいと思います)。
BSDはClangが標準なのか
Wikipediaの「Clang」を読むと、「FreeBSDにおいて標準のコンパイラとして採用されている。」と記されていました(アクセス日:2020-10-13)。当サイトのサーバーは、FreeBSD 11.2を使っているので、実際にgcc
、g++
、cc
、c++
の四つのコマンドのバージョンを確認してみました。結果は、gcc
とg++
はGNU、cc
とc++
はClang
でした。
$ gcc --version
gcc (FreeBSD Ports Collection) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ --version
g++ (FreeBSD Ports Collection) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ cc --version
FreeBSD clang version 6.0.0 (tags/RELEASE_600/final 326565) (based on LLVM 6.0.0)
Target: x86_64-unknown-freebsd11.2
Thread model: posix
InstalledDir: /usr/bin
$ c++ --versionFreeBSD clang version 6.0.0 (tags/RELEASE_600/final 326565) (based on LLVM 6.0.0)
Target: x86_64-unknown-freebsd11.2
Thread model: posix
InstalledDir: /usr/bin
シンボリックリンクを作る?
ネットではパスが通っているディレクトリにシンボリックリンクを作る、という記事が多い気がします。次のコードは、ネットで見かけたもので、秘伝のタレの究極形ともいえる複雑さがあります。
$ sudo ln -sf $(ls -d /usr/local/bin/* | grep "/g++-" | sort -r | head -n1) /usr/local/bin/g++
書き直すならこうかな、と思います。
$ ln -s $(which g++-10) /usr/local/bin/g++
何をやっているのかというと、g++
というシンボリックリンクを、/usr/local/bin/
に作ることで、g++
の本来のパス(/usr/bin/g++
)より後にパスが通る/usr/local/bin/g++
が優先されて実行されています。しかし、これではバージョンが変わった時に修正が大変なので、エイリアスを使った方がいいです。
$ pwd
/usr/local/bin
$ ln -s g++-10 g++
$ ls -l g++*
lrwxr-xr-x 1 hase admin 8 Oct 13 08:04 g++ -> ./g++-10
lrwxr-xr-x 1 hase admin 31 Oct 12 20:51 g++-10 -> ../Cellar/gcc/10.2.0/bin/g++-10
$ readlink g++
./g++-10
$ readlink -f g++
/usr/local/Cellar/gcc/10.2.0/bin/g++-10
冒頭のコマンドの解説
冒頭で提示したコマンドを解説します。
$ brew install gcc
brew
でgcc
をインストールします。
$ which gcc-{1..100}
/usr/local/bin/gcc-10
which
コマンドでgcc
の場所を表示させます。このとき、gcc
のバージョンを確実にひろうために、{1..100}
と、ブレース展開で総当りしました。
$ echo alias gcc="'"$(!!)"'" >> .bashrc
この結果をエイリアスにしたいので、echo
でエイリアスを書いて.bashrc
に追記します。このときの$(!!)
は、コマンド置換($()
)で直前のコマンド(ヒストリ置換(!!
))を実行したものです。展開すると、$ echo alias gcc="'"$(which gcc-{1..100})"'" >> .bashrc
になります。
$ ^gcc='gcc^g++='g++^
g++
にも同じ処理をしますが、また同じ手順を踏むのは面倒です。そこで、直前のコマンドを文字列置換して実行しましょう。置換対象の文字列を^
(ハット)で囲み、続けて置換したい文字列を記述して、^
で閉じます。そして、リターンを押すと文字列が置換されて実行されます。展開すると、$ echo alias g++="'"$(which g++-{1..100})"'" >> .bashrc
です。
$ . !$
最後に.bashrc
を読み込んでエイリアスを使えるようにします。souce
コマンドである.
の引数には、やはりヒストリ置換の!$
が指定されています。!$
は、直前のコマンドの最後の引数、つまり.bashrc
に置換されます。
更新情報
- 作成日:2020-10-13
- 更新日:2021-05-10
- 更新日:2022-04-28
- 更新日:2023-05-17