macOSでgccを使う
macOSでgccやg++を使うと、本来のgccではなく代替コンパイラであるclangが実行されてしまう。それでは困る場合もあるので、正しいgccを実行する方法(わざわざ書くほどの内容でもない)。環境:macOS 10.14、bash 5.0.18
次のように書けば、本来のgccが実行できるので詳しく見ていこう(gccに付された数字はバージョン)。
$ brew install gcc
$ echo "alias gcc='gcc-10'" >> .bashrc
$ ^gcc='gcc^g++='g++^
$ . !$
$ 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をインストールする
macOSに、gccをインストールする。つまり、macOSには、本来の(GNU Compiler Collectionとしての)gccが入っていない。ここではbrewを使ってインストールする。
$ brew install gcc
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
Updated 6 formulae.
==> Downloading https://homebrew.bintray.com/bottles/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は、ファイル名の末にファイルタイプを表示する。/がディレクトリ、*が実行ファイル、@がシンボリックリンクである。
$ ls -F /usr/local/Cellar/gcc/10.2.0/
COPYING INSTALL_RECEIPT.json README include/ libexec/
ChangeLog NEWS bin/ lib/ share/
この中のbin(Binary code)に実行ファイルが格納されているので、確認してみよう。このうち、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をインストールしたが、そのままgccと入力しても相変わらずclangが実行されてしまう。というのも、インストールしたgccの実行ファイル名は、gccではなく、gcc-10だからだ。gcc-10と入力すれば、本来のgccが実行されるが、それでは使いにくいのでaliasを設定する。
$ 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
$ which gcc
/usr/bin/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にaliasを設定する。前述のシンボリックリンクのパスを記述するが、実体のパスやコマンドでも問題ない。好みで書けばよい。
$ 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を再読み込みする。
$ . !$
これで、本来の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.
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++ --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
シンボリックリンクを作る?
ネットではパスが通っているディレクトリにシンボリックリンクを作る、という記事が多い気がする。次のコードは、ネットで見かけたもので、秘伝のタレの究極形ともいえる複雑さがある。
$ 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++が優先されて実行されるというわけだ。しかし、このような使い方は、あまり推奨できないので、aliasで実現したほうがよいだろう。
$ 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
更新情報
- 公開日:2020-10-13