#navi_header|C言語系| GNU Libtoolの自分用メモ - GNU Libtool 本家 -- http://www.gnu.org/software/libtool/ - GNU Libtool HTMLドキュメント(1ページ版) -- http://www.gnu.org/software/libtool/manual/libtool.html Libtoolは共有ライブラリに関する処理(compile/link/install, etc...)をエレガントに行えるようになっている。 - "libtool"コマンドによる単独でのcompile/link/installの実行 - "libtoolize"コマンドとm4マクロによる、automake/autoconfとの連携 * "libtool"コマンド単体での利用 コンパイル : 非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 : サポートする過去のインターフェイス番号の範囲で、current - age までの値のインターフェイス番号がサポートされる。 soファイルのバージョン番号は、次のように若干組み替え・並び替えてつけられる。 libXXYY.so.(-).. 例: $ 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 " - "となる理由は、サポートするバージョン番号の範囲の最小を指定する為である。"3:2:1"なら、バージョン番号2でも動作する。ということは、libXXYY.so.2.x.x というファイル名でも動く必要がある。このような事情で、".so"に続く1番目のメジャー番号は"-"となっている。 * Autoconf/Makefile.amへの組み込み configure.acが用意されている状態を前提とする。 Autoconfへの組み込み: + "libtoolize -c"でサポートスクリプトを追加する。(configure.acでAC_CONFIG_AUX_DIRが指定されていれば、指定されたディレクトリに追加される) + configure.acに AC_PROG_LIBTOOL マクロを追加する。 + "aclocal"を実行する。これによりaclocal.m4にLibtool提供のm4マクロが組み込まれ、AC_PROG_LIBTOOLなどが実行可能となる。 Makefile.amへの組み込み: - 実行可能形式にLibtoolライブラリをリンクするには、LDADD接尾辞にLibtoolライブラリを指定する。 - Libtoolライブラリをビルド対象とするには、LIBRARIESではなくLTLIBRARIESを利用する。 - "-version-info"は、LDFLAGS接尾辞に指定する。"-rpath"はAutmake側でよしなに設定してくれる為設定無用。 例: 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時点のものなので、将来変更される可能性がある) - "libtool"コマンド単体の機能やオプションを知りたい -- "3 Using libtool", "4 Invoking libtool" 参照 - Makefile.amへの組み込み方の詳細を知りたい -- "5 Integrating libtool with your package" → "5.3 Using Automake with libtool" 参照 - "libtoolize"コマンドの詳細やサポートスクリプトについて知りたい -- "5.5 Including libtool in your package" 参照 - Libtoolのバージョン番号の考え方の詳細を知りたい -- "7 Library interface versions" 参照 #navi_footer|C言語系|