なんでApple clangでコンパイルされるの?
C++を勉強しているある日のこと。いつものようにMacでg++でコンパイルしているとエラーが発生。原因を解明するためにg++のバージョンを調べてみたら、Apple clangと表示される。え、g++じゃないの?今までclangでコンパイルしてたの?そいった疑問が浮かんだので、clang、gcc、g++などについて調べてみた。
※本記事はの内容は勉強途中ですので必ずしも正しいとは限りません。間違いがあれば教えていただけると幸いです。
概要
この記事では、clang、gcc、g++について調べたことをまとめている。clang、gcc、g++はいずれもコンパイラであるが、それぞれが異なる言語や機能をサポートしており、異なる用途で使用される(g++はgccの拡張版のようなもの。おそらくApple clangとclangは同じもの)。本記事では、それぞれのコンパイラについて調査した内容をまとめた。
Macのデフォルト設定
M2 Macでclang、g++、gccのバージョンを調べてみた結果が以下の通りである。いずれもApple clangになっているのがわかる。これだけでは、C++のどのバージョンでコンパイルしているのかがわからない。
~ % clang --version Apple clang version 14.0.3 (clang-1403.0.22.14.1) Target: arm64-apple-darwin22.4.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
~ % g++ --version Apple clang version 14.0.3 (clang-1403.0.22.14.1) Target: arm64-apple-darwin22.4.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
~ % gcc --version Apple clang version 14.0.3 (clang-1403.0.22.14.1) Target: arm64-apple-darwin22.4.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
C++のコンパイラの種類
Apple clang(clang)
Apple clang は、Appleが提供するC言語およびC++のコンパイラである。 Appleのプラットフォーム(macOS、iOSなど)で広く使用されている。 Xcodeやその他のAppleの開発ツールと緊密に統合されており、アプリケーション開発に最適化されている。LLVM(Low Level Virtual Machine)ベースであり、LLVMプロジェクトに基づいて開発されている。(詳しくはLLVMについて)
gcc
gcc(GNU Compiler Collection)は、GNUプロジェクトが開発したコンパイラで、C言語を主な対象としているが、C++などの他の言語もサポートしている。 多くのUnix系OSで標準のコンパイラとして使用されている。 オープンソースであり、多くのプラットフォームで使用されている。 GNUにより発足したコンパイラ。
g++
g++(GNU C++ Compiler)は、gccの一部であり、C++言語を主な対象としている。しかし、C言語のコンパイルも可能である。C++の標準規格に従ってプログラムをコンパイルすることができる。
つまり、clangはAppleが、gccはGNUが発足したコンパイラであることがわかった。また、g++はgccの一部であることから、互換性があると考えられる。
C++のバージョンによるエラー
Macでgccを使いたい場合は、homebrewからインストールする必要がありそうである(デフォルトではApple clang)。追加でインストールしなくてもApple clangでコンパイルする際に、C++のバージョンをしっかりと指定してあげることで、開発環境による依存やバージョンの問題に直面することは少なくなるだろう。
g++ -std=c++14 xxx.cpp
このような感じでc++のバージョンを指定することでエラーは回避できた。原因は、C++14以前ではサポートされていないことを記述していたためであると考えられる。
まとめ
- MacのデフォルトはApple clangであり、gccやg++と入力してもclangでコンパイルされる
- clangとgccは発足元が異なるため、完全な互換性があるかは不明
- Macでgccを使いたい場合は、homebrewなどからインストールする必要がある
- コンパイルの際は、C++のバージョンを指定することでエラーを回避