clangでc++コードをコンパイルする方法(解説付き)




小ネタです。

以下のようなC++プログラムがあるとします。一見全く問題なさそうです。

しかし、このプログラムを以下のように clang コマンドでコンパイルすると、コンパイルエラーになります。(Mac 環境)

結論として、clang++コマンドを使ってコンパイルするのが正解です。
clang++ を使うと、無事コンパイルができました。

 
 
 

このまま終わるのは腑に落ちないので、もう少し背景を説明します。

clang と clang++ の違いは、ライブラリのリンク時に C++ のライブラリを呼び出すかどうかという点です。この違いは clang, clang++ コマンドに -v オプションをつけて呼び出すとわかります。

-v オプションをつけて、リンク部分の出力を取り出すと次のようになるはずです。
注目すべき点は、/usr/bin/ld というリンクが実行される部分です。

clang の出力

clang++ の出力

/usr/bin/ld の行を比較すると、clang++ の出力には -lstdc++ という C++ のライブラリがリンクされているのがわかります。一方で、clang の方はこのリンクがありません。

だから、C++ 固有の std::cout, std::ostream::operator<< などが undefined symbol (意味:宣言はあるけど、実装がない)となり、コンパイルエラーになることがわかります。




Posted in: c++ |

Leave a Reply

Your email address will not be published. Required fields are marked *