Boostのビルド、あるいは共有ライブラリの悲劇 (2)

Boostをふつうにビルドすると、たぶん静的ライブラリと共有ライブラリが生成される。静的ライブラリはオブジェクトファイルを寄せ集めただけなので、問題はない。すくなくとも共有ライブラリほど問題はない。共有ライブラリはおおいに問題である。Mac OS X (Darwin)の共有ライブラリは特に。


以下、Mach-Oを使うシステムとしてMac OS X、ELFを使うシステムとしてGNU/Linuxについて話す(Microsoft Windowsのことは知らない)。Finkの文書はMach-Oの暗部を簡潔にまとめている。

Mach-O の仕様の一つであり、多くの人を驚かせるものとして、共有ライブラリと 動的ローダブル・モジュールを厳密に区別します。ELFシステムでは両者は同質で、共有コードのどの部分でも、ライブラリとしても動的ローディングにも使うことができます。

Fink - Porting - Shared Code

共有ライブラリを作成する場合、実行時に検索するライブラリの名前を指定することができます、これはよく行われることで、これによって、ライブラリのいくつかのメジャーバージョンをインストールすることが可能になります。ELFシステムでは、これはsonameと言われています。Darwinの場合、ファイル名の他にフルパスを指定することができ(またする必要があり)ます。これにより、"rpath"オプションとldconfig/ld.so.cacheシステムが不要になります。まだインストールされていないライブラリを使うには、DYLD_LIBRARY_PATH環境変数を設定することもできます。詳細はdyldのmanページをご覧ください。

Fink - Porting - Shared Code

「(またする必要があり)ます」。ここは暗部、試験に出る。要約すると、rpathを基本的に使わない(使いたければさらなる暗部に踏みこむ覚悟が必要)。暗部に踏みこみたくなければ、解決方法は簡単。


【結論そのに】Boostのライブラリをリンクするときは静的ライブラリをリンクしよう。


ただし、静的ライブラリと共有ライブラリが両方使えそうに見える場合、共有ライブラリを優先することに注意。てっとり早い解決策は、共有ライブラリをビルドしない、あるいは削除してしまうこと。完全な静的リンクはお勧めしかねる(そもそもMac OS Xはlibcが提供されていないので静的リンクできない)。