作曲・浄書・指導・音響

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。

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/に置かれている。

さて、実行結果の最終行を見ると、実体のインストール先(/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をインストールしたが、そのままでは相変わらず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