GNU Libtoolの自分用メモ
Libtoolは共有ライブラリに関する処理(compile/link/install, etc...)をエレガントに行えるようになっている。
コンパイル : 非PIC版がカレントディレクトリに、PIC版が".libs/"以下に生成される。
$ libtool --mode=compile gcc -c foo.c -o foo.lo
(foo.lo はlibtoolが扱うメタデータ用テキストファイル)
ライブラリの作成 : ".libs/"以下に静的ライブラリ(*.a)と共有ライブラリ(*.so)の両方が作成される。
$ libtool --mode=link gcc -o libfoo.la foo.lo -rpath /usr/lib
(libfoo.la はlibtoolが扱うメタデータ用テキストファイル, "-rpath"は共有ライブラリの生成指示であり、同時に共有ライブラリのインストール先を指定している)
実行可能形式の作成 : カレントディレクトリに作成されるのはラッパースクリプトで、実際のバイナリは".libs/"以下に生成される。
$ libtool --mode=compile gcc -c main.c -o main.lo $ libtool --mode=link gcc -o main main.lo -L. -lfoo
インストール : 実際のバイナリのコピー、ライブラリのシンボリックリンクの生成などが行われる。
$ libtool --mode=install install -m644 libfoo.la /install/path $ libtool --mode=install install -m755 main /install/path $ libtool --finish ("-rpath"に指定したディレクトリ) # optional, ldconfigの実行など
生成したファイルの削除 :
$ libtool --mode=clean rm -f *.lo *.la main
"link"モードで "-version-info" オプションにより指定する。
$ libtool --mode=link ... -version-info <current>:<revision>:<age>
soファイルのバージョン番号は、次のように若干組み替え・並び替えてつけられる。
libXXYY.so.(<current>-<age>).<age>.<revision>
例:
$ libtool --mode=link ... -version-info 3:2:0 → libXXYY.so.3.0.2 $ libtool --mode=link ... -version-info 3:2:1 → libXXYY.so.2.1.2
"<current> - <age>"となる理由は、サポートするバージョン番号の範囲の最小を指定する為である。"3:2:1"なら、バージョン番号2でも動作する。ということは、libXXYY.so.2.x.x というファイル名でも動く必要がある。このような事情で、".so"に続く1番目のメジャー番号は"<current>-<age>"となっている。
configure.acが用意されている状態を前提とする。
Autoconfへの組み込み:
Makefile.amへの組み込み:
例:
bin_PROGRAMS = testmain testmain_SOURCES = main.c testmain_LDADD = libfoo.la lib_LTLIBRARIES = libfoo.la libfoo_la_SOURCES = foo.c libfoo_la_LDFLAGS = -version-info 3:2:0
以下、GNU Libtool HTMLドキュメントでの主な見出しをポイントしておく。(見出しの番号については2009/11時点のものなので、将来変更される可能性がある)
コメント