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++ |

GitHub as a Platform

200px-GitHub

vim のパッケージ管理を pathogen から NeoBundle へと移行している時にふと思ったこと。

私は vim のパッケージ管理として pathogen を2年間使ってきた。指定したフォルダの中にパッケージを放り込むと、それを autoload してくれる優れもの。

しかし、最近の主流は VundleNeoBundle。これらは .vimrc に使いたいパッケージを明示的に書く必要があるけど、:NeoBundleInstall とか :NeoBundleInstall! とかすれば、パッケージがない場合はインストール、パッケージがある場合は更新を検出して、アップデートしてくれる。

つまり、.vimrc ファイルと Vundle or NeoBundle だけあれば、新しい vim 環境を簡単に構築できるという利点がある。

あるパッケージを使いたい場合、.vimrc には次のように書けばいい。

NeoBundle 'thinca/vim-quickrun'

これは http://github.com/thinca/vim-quickrun パッケージを利用しますという宣言である。GitHub からソースコードを取ってくるということなのだが、URLではなく、ユーザ名とリポジトリを指定するのである(もちろん、URLも指定可)。

これを見てふと思った。GitHub はプラットフォームなのだと。

考えてみると、他のプログラミング言語のパッケージ管理システムもこの書き方と同じだ。

  • node.js: npm
  • Ruby: rubygems
  • etc…

他にもあるかもしれないけど、GitHub からパッケージのソースコードを取得するのが、当たり前のようになっている。GitHub はただのホスティングサービスの枠を超えて、developer の拠り所なのだ。

将来、新しいプログラミング言語が生まれると、その言語のパッケージ管理システムも開発されるだろう。そして、パッケージの取得先として当たり前のように GitHub が選ばれるのだと思う。

私はこういうサービスを作りたい。