home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

C言語系/memos/libtool

C言語系/memos/libtool

C言語系 / memos / libtool
id: 484 所有者: msakamoto-sf    作成日: 2009-11-18 01:15:51
カテゴリ: C言語 

GNU Libtoolの自分用メモ

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
インターフェイス番号(インターフェイスが変わる時にインクリメント)
revision
実装バージョン(インターフェイスが変わらない限り、ここが増えていく)
age
サポートする過去のインターフェイス番号の範囲で、current - 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>"となっている。

Autoconf/Makefile.amへの組み込み

configure.acが用意されている状態を前提とする。

Autoconfへの組み込み:

  1. "libtoolize -c"でサポートスクリプトを追加する。(configure.acでAC_CONFIG_AUX_DIRが指定されていれば、指定されたディレクトリに追加される)
  2. configure.acに AC_PROG_LIBTOOL マクロを追加する。
  3. "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" 参照


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2009-11-18 01:17:46
md5:8e8d51decf8d3b78513497a1843d2349
sha1:97e9c2661d4735ee9c6478fd0fbdaa42daec45c0
コメント
コメントを投稿するにはログインして下さい。