libtoolを用いない場合,スタティックライブラリを作成するため,プログラ
マはar
コマンドを呼び出していました.
burger$ ar cru libhello.a hello.o foo.o burger$
しかしもちろん,それだけではあまりに単純すぎて,多くのシステムでは(そ
れ以上のカルマや何かを与えるため)結果として生成されたライブラリ上で,
ranlib
コマンドを実行する必要があります.
burger$ ranlib libhello.a burger$
libtoolの“ライブラリはプログラム”というアプローチであるといるこの作
業に対して,Cコンパイラを使用することはより自然に感じられます.その
ため,共有ライブラリが無いプラットフォームでは,libtoolは単純にシステ
ムのar
(そして可能ならranlib
)コマンドのラッパーとして動作
します.
また,libtoolのライブラリ名は,標準の名前(`.a'接尾子の代わりに `.la'接尾子を持ちます)とは異なります.libtoolの引数は,コンパイラで libhello.laという名の実行形式を生成するために使用したのと同じも のです(see Link mode).
a23$ libtool --mode=link gcc -g -O -o libhello.la foo.o hello.o libtool: cannot build libtool library `libhello.la' from non-libtool \ objects a23$
あぁ!libtoolは通常のエラーを得てしまいましたた...ライブラリオブジェ クトの代わりに,標準のオブジェクトからライブラリをビルドしています.こ れはスタティックライブラリでは問題ありませんが,共有ライブラリシステム では非常に重要です.
そのため,今回はライブラリオブジェクトファイルを用いて,もう一度試して
みましょう.foo.cがcos
数学ライブラリを使用しているので,
コマンドラインに-lmを加える必要があることも忘れないでください
(see Using libtool).
共有ライブラリをビルドするその他の複雑なことは,(最終的に)インストール されるディレクトリパス(この場合は,/usr/local/lib) 1を指定する必要があることです.
a23$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \ -rpath /usr/local/lib -lm mkdir .libs ar cru .libs/libhello.a foo.o hello.o ranlib .libs/libhello.a creating libhello.la a23$
さて,共有ライブラリのプラットフォーム上で同じトリックを試してみましょ う.
burger$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \ -rpath /usr/local/lib -lm mkdir .libs ld -Bshareable -o .libs/libhello.so.0.0 foo.lo hello.lo -lm ar cru .libs/libhello.a foo.o hello.o ranlib .libs/libhello.a creating libhello.la burger$
さてそれはかなり賢いです...libtoolは共有ライブラリを作成するため,
スタティックライブラリと同様に,曖昧なld
コマンドを実行しただけ
です.
libtoolが,現在のディレクトリではなく,.libsサブディレ クトリに余分なファイルを作成することに注意してください.この機能は,ビ ルドディレクトリをきれいにするのをより簡単にするためと,たまたま libtoolの使用を忘れていて他のプログラムを実行するとき,確実に手ひどく 失敗するので役に立ちます.