[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風環境のコンパイラが採用している、業界標準とも呼ぶべきものがある。
というわけで、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:
Post a Comment