ノード:Static libraries, 前:Installing executables, 上:Using libtool



スタティックライブラリとのリンク

libtoolの旨味を知って,arranlibの愚かさへなぜ戻るので しょう?さて,決して共有されるはずがないスタティックアーカイブをつくる ことが望ましいときもあります.最もよくある状況として,複数の異なるプロ グラムをビルドするために使用する,オブジェクトファイルの集まりを持って いるときがあります.個々のプログラムに対し,すべてのオブジェクトファイ ルをリストアップする代わりに,それらのオブジェクトから"コンビニエンス ライブラリ"を作成し,ライブラリとプログラムをリンクすることが可能です. この技術は,他のディレクトリのライブラリへのリンクをサポートするので, 他のディレクトリのソースからビルドされるオブジェクトファイルをリンクす るサポートが欠けている,GNU automakeを補うためによく使用されます.この 制限は,リリース1.4までのGNU automakeに当てはまります.より新しいリリー スは,他のディレクトリのソースをサポートするでしょう.

このコンビニエンスライブラリとプログラムをリンクしたいだけの場合,完全 にlibtoolを無視し,古いarranlibコマンド(や,対応する GNU automake _LIBRARIES規則)が使用可能です.(おそらく使用したく はないでしょうが)libtoolを使用して,コンビニエンスライブラリをインストー ルすることさえ可能です.

     burger$ libtool --mode=install ./install-sh -c libhello.a /local/lib/libhello.a
     ./install-sh -c libhello.a /local/lib/libhello.a
     ranlib /local/lib/libhello.a
     burger$
     

スタティックライブラリのインストールにlibtoolを使用すると,ライブラリ が(-sフラグを使用したインストーラの場合のように)偶然stripされる ことから守り,自動的に実行される正しいranlibコマンドと同様にな ります.

しかし,libtoolライブラリは単にオブジェクトファイルの集合以上です.そ れらは古いアーカイブにはない,ライブラリの依存情報も伝えることが可能で す.libtoolのスタティックなコンビニエンスライブラリを作成したい場合, スタティックライブラリのみに興味があることを示すため,-rpathフ ラグを省略し-staticを使用することができます.そのようなスタティッ クライブラリとリンクするとき,libtoolは実際にすべてのオブジェクトファ イルと依存するライブラリをプログラムにリンクします.

-rpath-staticの両方を省略した場合,libtoolは,他の libtoolライブラリで,共有ライブラリの作成にすら使用可能なlibtoolのコン ビニエンスライブラリを作成します.スタティックな場合のように,ライブラ リは一組のオブジェクトファイルと依存するライブラリの別名として動作しま すが,この場合,オブジェクトファイルは共有ライブラリに含まれるほうが適 しています.しかし,直接または間接的に,単一のプログラムやライブラリに 単一のコンビニエンスライブラリをリンクしないように注意して下さい.さも なければ,シンボル再定義に関するエラーを得るでしょう.

GNU automakeを使用するとき,-rpathオプションがリンク時に渡され ないように,コンビニエンスライブラリに対するlib_LTLIBRARIESの代 わりにnoinst_LTLIBRARIESを使用した方が良いでしょう.

経験的に,最大一つのlibtoolライブラリにlibtoolのコンビニエンスライブラ リをリンクし,プログラムにはリンクしないようにしてください,そして, libtoolのコンビニエンススタティックライブラリを一つのプログラムにのみ リンクし,それは,ライブラリ依存情報をコンビニエンススタティックライブ ラリのユーザに伝えることが必要な場合のみにしてください.

スタティックなリンクが適している,その他の一般的な状況は,独立したバイ ナリを作成するときです.リンクにlibtoolを使用し,-all-staticフ ラグを加えてください.