次: , 前: Creating object files, 上: Using libtool


3.2 ライブラリのリンク

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.ccos数学ライブラリを使用しているので, コマンドラインに-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の使用を忘れていて他のプログラムを実行するとき,確実に手ひどく 失敗するので役に立ちます.


脚注

[1] rpathを指定しない場合,libtoolはコンビニエンスアーカ イブをビルドしますが,それは共有ライブラリではありません(see Static libraries)