2012-05-24

libc++のビルド方法

[cfe-dev] Building libc++ on Linux

LLVM公式のC++のSTLの実装であるlibc++のビルド方法には、まともなドキュメントがない。これは、libc++のビルドは、そう簡単ではないからだ。実は、libc++自体のビルド自体は、他のいわゆる.soにコンパイルされるライブラリと何ら変わらない。結局、ソースコードを全部まとめて、ライブラリファイルとしてコンパイルすればいい。それこそ、根本的にはたったの一行のコードですむ。

clang -std=c++11 -shared *.cpp -o libc++.so

ただし、このコマンドラインには、一つ重要な指定が欠けている。C++のランタイムライブラリである。

C++のランタイムライブラリとは、RTTIや例外機構、デマングルなどの低級な機能を提供するライブラリである。慣習的に、UNIX風の環境では、C++の低級なランタイムライブラリの実装とSTLの実装を分割している。ランタイムライブラリには、定まった規格があるわけではないが、多くのUNIX風環境のコンパイラが採用している、業界標準とも呼ぶべきものがある。

Itanium C++ ABI

というわけで、C++のランタイムライブラリのヘッダーへのパスとライブラリファイルを指定しなければならない。ランタイムライブラリの実装は多数ある。ランタイムライブラリの選択は、技術的、政治的理由により難しい。主な候補は3つある。

libsupc++
最も古いGNUによる実装である。stdlibc++で使われているC++ランタイムライブラリの実装でもある。GCC標準のランタイムライブラリであるので、実績は十分にある。通常のGCCとのバイナリレベルでのC++互換性を実現したいならば、これを使うしかない。ただし、実装に問題があるそうだ。また、ライセンスもstdlibc++と同じなので、GNUの定義する自由が気に入らない人間には、使いづらいライセンスである。もっとも、STLというのはソースコードの形でリンクして使うので、リンク例外があるのだが。
libcxxrt
比較的新しいPathScaleの実装であり、GNU/LinuxやFreeBSDやNetBSDやSolarisといった環境で、実用的に使われている実績がある。FreeBSDは、libcxxrtを標準で使っている。現在のところ、最も完成されたC++ランタイムライブラリであると言える。ただし、GCC互換性がない
libc++abi
最も新しいLLVM公式プロジェクトによる実装である。まだまだ開発途中で問題も多いそうだ。

どれを使うかというのは、GCCとのバイナリ互換を目指すか、無難に実用的なlibcxxrtにするか、あるいはLLVM公式の実装を使うかという、非常に難しい選択を迫られる。

つまり、単なるユーザーが気軽にlibc++をコンパイルして実用的な環境に投入するのは、おすすめできない。これは、環境を構築する者の仕事だ。たとえばGNU/Linuxのディストロとか、FreeBSDとか。

No comments: