ライブラリ名に関する注意事項

Boost C++ Librariesに含まれるライブラリ要素の多くは、単にヘッダファイルをインクルードするだけで使用することができます。しかし、いくつかのライブラリ要素はライブラリをリンクしなければなりません。比較的よく利用する正規表現やファイルシステム関連もライブラリのリンクが必要です。

使用している処理系がVisual C++であれば、#pragma comment指令を用いて自動的にリンクしてくれるのでよいのですが、GCCなどでは、Makefileの中で明示的にライブラリを指定する必要があります。そこで問題になってくるのがライブラリ名です。

Boost C++ Librariesのライブラリ名は、おおむね次のような形式になっています。

[lib]boost_<library>-<toolset>[-mt][-d][-<version>].<suffix>

ここで、[ ] で囲まれた部分は、ライブラリの種類によって有無が異なるものです。< > で囲まれた部分には適切な文字列が適用されます。

先頭の lib は、Unix 系のシステムでは常に付加されます。Windows では、静的リンクの場合に限り、lib 付きの名前を持つライブラリが構築されます(DLL を使用するライブラリには lib は付加されません)。

library の部分はライブラリの種類を表すもので、regexfilesystem などが入ります。toolset はコンパイラを特定する部分で、gcc とか vc71 とか vc80 のような文字列が入ります。

-mt はマルチスレッド対応の場合に付加されます。-d はデバッグ版のライブラリに付加されます。version は Boost C++ Libraries のバージョンで、1_33_1 とか 1_34 などが入ります。最後の suffix はいわゆる拡張子で、Unix 系であれば a 等が、Windows であれば lib が入ります。

一応、ここまでが原則です。実際には、なかなかこの通りに行かない場合があり、複数の環境でコンパイルできるプログラムを書こうとすると、互換性のある Makefile を書くのはかなり面倒です。

まったくコンパイラが異なれば、Makefile を別にするのも致し方ありませんが、同じ GCC を使うのに、いろいろと場合分けをしないといけないのが非常に面倒です。主な理由としては、ビルドツールである bjam がいまいち気が利かないことと、Linux 等のディストリビュータが勝手なライブラリ名を付けてしまうことにあります。

面倒な環境の筆頭は MinGW です。MinGW 用のライブラリを構築しようとして bjam を使うと、suffix 部分がすべて lib になってしまいます。これでは、-lboost_regex-mgw-mt-s のような指定ができなくなるため、ライブラリを指定するには、フルパス名または相対パス名を使用しなければならなくなってしまいます。

Cygwin でも bjam を使えば同じことが起きるのですが、幸いにして Cygwin の場合はインストーラで Boost C++ Libraries をインストールでき、その場合には a になっていますので大きな問題はなさそうです。

次に面倒なのは、Fedora Core です。Fedora Core もインストーラで Boost C++ Libraries をインストールしてくれるのはよいのですが、-<toolset>[-mt][-d][-<version>] の部分がごっそり省略されてしまうようです。

こうした問題がなくても、Boost C++ Libraries はバージョン間の互換性が完全ではないため、バージョン名まで指定しないといけない不便さがあったりします。互換性の問題はともかく、とにかく最新バージョンを使用したいという場合には、これまた指定方法が面倒です。autoconf を使う場合には、AX_BOOST_BASE が使えるようですが、未確認のため正確なことはわかりません。

結局、すべてを網羅できるような気の利いた方法はなく、make 時にパラメータを指定するなどの方法で回避するしか手の打ちようがないというのが現時点での認識です。

このエントリーを含むはてなブックマーク