1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
|
.\" You may copy, distribute and modify under the terms of the LDP General
.\" Public License as specified in the LICENSE file that comes with the
.\" gnumaniak distribution
.\"
.\" The author kindly requests that no comments regarding the "better"
.\" suitability or up-to-date notices of any info documentation alternative
.\" is added without contacting him first.
.\"
.\" (C) 1999-2002 Ragnar Hojland Espinosa <ragnar@ragnar-hojland.com>
.\"
.\" libtool man page
.\" man pages are NOT obsolete!
.\" <ragnar@ragnar-hojland.com>
.\"
.\" Japanese Version Copyright (c) 2000-2003 Yuichi SATO
.\" all rights reserved.
.\" Translated Mon Jun 5 02:20:58 JST 2000
.\" by Yuichi SATO <sato@complex.eng.hokudai.ac.jp>
.\" Updated & Modified Sat Mar 1 23:41:22 JST 2003
.\" by Yuichi SATO <ysato444@yahoo.co.jp>
.\"
.\"WORD: build ビルド
.\"WORD: compiler コンパイラー
.\"WORD: canonical 標準
.\"WORD: executable 実行ファイル
.\"WORD: design 設計
.\"WORD: dlopen ダイナミックロード
.\"WORD: dlopening support ダイナミックロード機能
.\"WORD: global 大域
.\"WORD: library ライブラリ
.\"WORD: shared 共有
.\"WORD: static 静的
.\"WORD: partial linking 部分リンク
.\"
.TH LIBTOOL 301 "June 2002" "libtool 1.4.2"
.SH 名前
\fBlibtool\fR \- ライブラリのコンパイル・ビルド・
インストール・アンインストールをする
.SH 書式
.B libtool
.RB [ \-n ]
.RB [ \-\-config ]
.RB [ \-\-debug ]
.RB [ \-\-dry\-run ]
.RB [ \-\-features ]
.RB [ \-\-finish ]
.RB [ \-\-mode=\fIMODE ]
.RB [ \-\-quiet ]
.RB [ \-\-silent ]
.RI [ MODE\-ARGS... ]
リンクモード: [\fB\-l\fINAME\fR] [\fB\-o \fI OUTPUT\-FILE\fR] [\fB\-L\fILIBDIR\fR]
[\fB\-R \fILIBDIR\fR]
.RB [ \-all\-static ]
.RB [ \-avoid\-version ]
.RB [ "\-dlopen \fIFILE" ]
.RB [ "\-dlpreopen \fIFILE" ]
.RB [ \-export\-dynamic ]
.RB [ "\-\-export\-symbols \fIFILE" ]
.RB [ "\-\-export\-symbols \fIREGEX" ]
.RB [ \-\-module ]
.RB [ \-no\-undefined ]
.RB [ "\-release \fIRELEASE" ]
.RB [ "\-rpath \fILIBDIR" ]
.RB [ \-static ]
.RB [ "\-version\-info \fICURRENT\fR[\fB:\fIREVISION\fR[\fB:\fIAGE" ]]
実行モード: [\fB\-dlopen \fIFILE\fR]
.BR libtool " [" \-\-features "] [" \-\-help "] [" \-\-version ]
.SH 説明
.B libtool
は静的ライブラリや共有ライブラリの
コンパイル・リンク・インストール・アンインストールの複雑さを簡略化する。
異なるプラットフォームそれぞれで、完全な機能を
統一的なインターフェースを介して使用することができ、
プラットフォーム固有の厄介な癖はプログラマーから隠蔽される。
.B libtool
はコンパイル・実行・リンク・フィニッシュ・インストール・アンインストール
という 6 つのモードで動作できる。
.SS コンパイルモード
\fBコンパイル\fRモードの場合、\fIMODE\-ARGS\fR は
標準的なオブジェクトファイルを作成するために使われる
コンパイラコマンドである。
これらの引き数は C コンパイラの名前で始まり、
オブジェクトファイルのみを作成するよう、
\fB\-c\fR コンパイラフラグを含んでいなければならない。
\fBlibtool\fR は出力ファイルの名前を決定するとき、
ソースファイル名からディレクトリ構成要素を取り除き、
それから C 言語のソースコードの拡張子 `.c' をライブラリオブジェクトの
拡張子 `.lo' に置き換えるという方法を用いる。
共有ライブラリがビルドされる場合、必要な PIC 作成フラグすべてが
コンパイルコマンドに挿入される。
\fB\-static\fR オプションを指定すると、たとえ \fB\-\-disable\-static\fR が
設定されていたとしても、\fBlibtool\fR は `.o' ファイルを作成する。
\fB\-o\fR オプションが直接サポートされていないプラットフォーム上では
(コンパイラによって作成されたオブジェクトファイルのロックと移動により)
エミュレートを行う。
したがって、以下のような通常の構文を使うことができる。
.sp
.RS
.nf
lightside:% libtool cc -c foo/x.c -o foo/x.lo
.fi
.RE
.sp
プラットフォームが \fB\-c\fR と \fB\-o\fR オプションをサポートしていない場合、
古い `foo/x.o' を上書きせずに `foo/x.lo' をビルドすることはできない。
この場合、`foo/x.o' が `foo/x.lo' の後に (再) ビルドされることを
確かめておかなければならない。
.SS リンクモード
\fBリンク\fRモードはライブラリや実行可能プログラムを作成するために、
オブジェクトファイル (ライブラリオブジェクトも含む) をリンクする。
\fIMODE\-ARGS\fR は、C コンパイラがオブジェクトファイルから
(\fB\-o\fR フラグにより) 出力ファイル \fIOUTPUT\-FILE\fR を作成する
ときに使用するコマンドで構成される。
以下のように、ファイルの形式は \fIOUTPUT\-FILE\fR の拡張子に依存する。
.TP
.B .la
libtool ライブラリを作成する。
このライブラリはライブラリオブジェクト (`.lo' ファイル)
のみからビルドされなければならない。
\fB\-rpath\fR オプションが必要である。
現在の実装では、libtool ライブラリはアンインストールされた他の
libtool ライブラリに依存できない。
.TP
.B .a
\fBar\fR(1) と (あるいは) \fBranlib\fR(1) を使って
標準ライブラリが作成される。
.TP
.B .o .lo
(一般には `ld \-r' を使うことで) 入力ファイルから
再ロード可能なオブジェクトファイルが作成される。
この手法は ``部分リンク'' と呼ばれることが多い。
.TP
.B other
実行可能なプログラムが作成される。
.SS 実行モード
\fB実行\fRモードでは、ライブラリパスの環境変数が自動的にセットされ
(そして \fB\-dlopen\fR によって修正されて)、プログラムが実行される。
一番目の \fIMODE-ARGS\fR はプログラム名として扱われ、
残りはプログラムの引数として扱われる。
引数の中のどれかが libtool 実行ファイルのラッパーであった場合、
その引数はそれぞれ対応するアンインストール済みバイナリの名前に変換される。
このとき、必要とされるライブラリディレクトリがライブラリパスに加えられる。
.SS インストールモード
\fBインストール\fRモードでは、\fIMODE\-ARGS\fR を
\fBcp\fR(1) もしくは BSD-互換の \fBinstall\fR(1) から始まる
インストールコマンドとして解釈する。
残りの \fBMODE\-ARGS\fR は、インストールコマンドの
引数として解釈される。
このコマンドは実行され、
インストール後の処理に必要な非特権コマンドもすべて完了する。
.SS フィニッシュモード
\fBフィニッシュ\fRモードは、システム管理者の libtool ライブラリ
インストール作業を補助し、 libtool ライブラリの探索およびユーザー
プログラムへのリンクができるようにする。
\fIMODE\-ARG\fR はライブラリディレクトリ名として解釈される。
このコマンドを実行するのにはスーパーユーザー特権が必要なため、
\fB\-\-dry\-run\fR オプションを使うと便利だろう。
.SS アンインストールモード
このモードではインストールされたライブラリ (もしくはファイル) を削除する。
一番目の \fIMODE\-ARG\fR はファイルを削除するためのプログラム名
(一般には `/bin/rm') である。
残りの \fIMODE\-ARGS\fR は削除プログラムの (`\-' で始まる) フラグもしくは、
削除するファイルの名前である。
.SH オプション
.SS グローバルオプション
.TP
.B \-\-config
libtool の設定変数を表示して終了する。
.TP
.B \-\-debug
シェルスクリプトのトレースモードを有効にして、標準出力に書き出す。
.TP
.B \-n, \-\-dry\-run
ファイルの作成・修正・削除を行わず、\fBlibtool\fR によってどのような
コマンドが実行されるかを表示する。
.TP
.B \-\-features
libtool の基本的な特徴を表示する。
また静的ライブラリと共有ライブラリが有効になっているかを表示する。
.TP
.B \-\-finish
\fB\-\-mode=finish\fR と同じ。
.TP
.B \-\-mode=\fIMODE
\fIMODE\fR をオペレーションモードとする。
デフォルトでは、オペレーションモードは \fIMODE\-ARGS\fR の内容から推論される。
\fIMODE\fR を指定する場合、次のうちの一つでなければならない。
.RS
.TP
.B compile
ソースファイルを libtool オブジェクトにコンパイルする。
.TP
.B execute
他のプログラムがアンインストールされたプログラムやライブラリ
(libtool により作成されたもの) を使うことができるように、
ライブラリパスを自動的に設定する。
.TP
.B finish
システムへの libtool ライブラリのインストールを完了する。
.TP
.B install
ライブラリや実行ファイルをインストールする。
.TP
.B link
ライブラリや実行ファイルを作成する。
.TP
.B uninstall
ライブラリや実行ファイルを削除する。
.RE
.TP
.B \-\-features
libtool の設定情報を表示して終了する。
このオプションを使うと、パッケージは共有ライブラリと静的ライブラリの
どちらを作るか決定できる。
.TP
.B "\-\-help"
使用法のメッセージを標準出力に表示して、正常終了する。
\fB\-\-mode=\fIMODE\fR が指定されている場合は、
指定されたモードについてのヘルプが表示される。
.TP
.B "\-\-version"
バージョン情報を標準出力に表示して、正常終了する。
.SS リンクモードオプション
.TP
.B -l\fINAME
\fIOUTPUT\-FILE\fR はインストール済みの
ライブラリ \fBlib\fINAME\fR を必要とする。
このオプションは \fIOUTPUT\-FILE\fR が実行ファイルでなくても必要とされる。
.TP
.B \-o \fIOUTPUT\-FILE
指定したオブジェクトとライブラリから \fIOUTPUT\-FILE\fR を作成する。
.TP
.B \-L\fILIBDIR
必要なインストール済みライブラリを \fILIBDIR\fR から検索する。
.TP
.B \-R \fILIBDIR
\fIOUTPUT\-FILE\fR が実行ファイルの場合は \fILIBDIR\fR を実行時パスに加える。
\fIOUTPUT\-FILE\fR がライブラリの場合は
`-RLIBDIR' を \fBDEPENDENCY_LIBS\fR に加える。
これは、そのライブラリが実行ファイルにリンクされるときに必ず
\fILIBDIR\fR を実行ファイルの実行時パスに加えるためである。
.TP
.B \-all\-static
\fIOUTPUT\-FILE\fR がプログラムの場合は、
そのプログラムをどの共有ライブラリともリンクさせない。
\fIOUTPUT\-FILE\fR がライブラリの場合は静的ライブラリを作成するのみである。
.TP
.B \-avoid\-version
どのような種類のバージョニングも行わない
(バージョン情報は組み込まれず、シンボリックリンクも作られない)。
このオプションはバージョニングを必要とするプラットホーム上では働かない。
.TP
.B \-dlopen \fIFILE
ホストプラットホーム上でネイティブな
ダイナミックロードがサポートされていない場合や、
実行ファイルが \fB\-static\fR や \fB\-all\-static\fR を
使ってリンクされる場合は、\fB\-dlpreopen \fIFILE\fR と同じ。
それ以外の場合は何も影響を及ぼさない。
\fIFILE\fR が `実行ファイル自身' であった場合、
libtool は実行ファイルが \fB\-export\-dynamic\fR や
\fB\-dlpreopen\fR を使って自らを \fBdlopen\fR(3) できるかを確かめる。
.TP
.B \-dlpreopen \fIFILE
\fIFILE\fR を出力プログラムにリンクし、そのシンボルを
\fBLT_PRELOADED_SYMBOLS\fR に加える。
\fIFILE\fR が `出力プログラム自身' であった場合、
出力プログラム自身のシンボルが \fBLT_PRELOADED_SYMBOLS\fR に加えられる。
.TP
.B \-export\-dynamic
\fIOUTPUT\-FILE\fR のシンボルを \fBdlsym\fR(3) を使って解決できるようにする。
.TP
.B \-export\-symbols \fIFILE
これをサポートしているプラットホーム上では、
リンカは \fIFILE\fR にリストされているシンボルのみをエクスポートする。
\fIFILE\fR の名前は `.sym' で終っていなければならず、
1 行に 1 つのシンボルを含んでいなければならない。
デフォルトではすべてのシンボルがエクスポートされる。
.TP
.B \-export\-symbols\-regex \fIREGEX
\fIREGEX\fR \fBregex\fR(7) にマッチするシンボルのみがエクスポートされる以外は
\fB\-export\-symbols\fR と同じ。
.TP
.B \-module
ダイナミックロードできるライブラリを作成する。
モジュール名は `lib' で始まる必要はないが、
名前の衝突を避けるため `libname' と `name' はパッケージの中で
同時に使用すべきではない。
.TP
.B \-no\-undefined
\fIOUTPUT\-FILE\fR が他のライブラリに依存していないことを宣言する。
他のライブラリに依存する共有ライブラリを作れないプラットホームもある。
.TP
.B \-release \fIRELEASE
ライブラリがパッケージのリリース \fIRELEASE\fR で作られたことを指定する。
これによって、ユーザーはどのバージョンが他のものより新しいかを
簡単に判断できる。
このフラグを使うと、パッケージの各リリースのいかなるペアの間にも
バイナリ互換はなくなることに注意せよ。
バイナリ互換にしたい場合は、\fB\-version\-info\fR フラグを使うこと。
.TP
.B \-rpath \fILIBDIR
\fIOUTPUT\-FILE\fR がライブラリの場合、
最終的に \fILIBDIR\fR にインストールされる。
.TP
.B \-static
\fIOUTPUT\-FILE\fR がプログラムの場合、
アンインストールされた共有 libtool ライブラリはリンクしない。
\fIOUTPUT\-FILE\fR がライブラリの場合、
静的ライブラリを作成するのみである。
.TP
.B \-version\-info \fICURRENT\fR[\fB:\fIREVISION\fR[\fB:\fIAGE\fR]]
\fIOUTPUT\-FILE\fR が libtool ライブラリであるとき、
ライブラリをビルドするためにインターフェースバージョン情報
\fICURRENT\fR, \fIREVISION\fR, \fIAGE\fR を使う。
パッケージのリリース情報を指定するために、
このオプションを使っては\fBいけない\fR。
むしろ \fB\-release\fR フラグを参照すべきである。
.SS 実行モードオプション
.TP
.B \-dlopen \fIFILE
\fIFILE\fR を含んでいるディレクトリをライブラリパスに加える。
.SH バージョニング
.B libtool
は共有ライブラリ用に独自のバージョニングシステムを持っている。
このシステムを使いたい場合は、\fB\-version\-info\fR オプションを
使わなければならない。
このオプションは
\fICURRENT\fR[\fB:\fIREVISION\fR[\fB:\fIAGE\fR]]
という形式の引数を受け付ける。
.TP
.I CURRENT
インターフェースのバージョン。インターフェースとは
"外側" の世界に見えるすべてのもので、
変数・関数プロトタイプ・出力形式などである。
.TP
.I REVISION
\fICURRENT\fR からの相対値で与える実装のバージョン。
.TP
.I AGE
このライブラリが実装している最新のインターフェースと
最古のインターフェースとの違い。
言い替えると、このライブラリは `\fICURRENT \- \fIAGE\fR' から
\fICURRENT\fR までの範囲のすべてのインターフェース番号を実装していて、
このバージョンの範囲にあるライブラリに対して過去にリンクされた
すべての実行ファイルは、このライブラリを使うことができる、
ということである。
.PP
\fIREVISION\fR と \fIAGE\fR が省略された場合のデフォルトは 0 である。
\fIAGE\fR は \fICURRENT\fR インターフェース番号より小さいか
等しくなければならないことにも注意すること。
2 つのライブラリが同一の \fICURRENT\fR 番号と \fIAGE\fR 番号であるとき、
ダイナミックリンカは大きい \fIREVISION\fR 番号のライブラリを選択する。
バージョニングのガイドライン:
\fB\(bu\ 1.\fR それぞれの libtool ライブラリについて
`0:0:0' というバージョン情報から始めなさい。
\fB\(bu\ 2. \fR バージョン情報を更新するのは
ソフトウェアの公開リリースの直前だけにしなさい。
頻繁な更新は不必要であり、現在のインターフェース番号が大きくなるのを
早くするだけである。
\fB\(bu\ 3.\fR 前回の更新からライブラリのソースコードが
すっかり変更されたなら、\fIREVISION\fR を増加させなさい
(\fIC\fB:\fIR\fB:\fIA\fR が \fIC\fB:\fIR+1\fB:\fIA\fR になる)。
\fB\(bu\ 4.\fR 前回の更新からインターフェースが
追加・削除・変更されたなら、\fICURRENT\fR を増加させ、\fIREVISION\fR を
0 にしなさい。
\fB\(bu\ 5.\fR 前回の公開リリースからインターフェースが
追加されたなら、\fIAGE\fR を増加させなさい。
\fB\(bu\ 6.\fR 前回の公開リリースからインターフェースが
削除されたなら、\fIAGE\fR を 0 にしなさい。
パッケージバージョンをライブラリ名にエンコードしたい場合や、
\fBlibtool\fR のバージョニングと衝突せずに
他のバージョニングシステムを使いたい場合は、\fB\-release\fR を使うこと。
たとえば binutils\-2.7.0.2 に付属する `libbfd.so.2.7.0.2' は
\fBlibtool\fR のバージョニングと明らかに衝突する。
`\-release 2.7.0' を使えば `libbfd\-2.7.0.so.0.0.0' で終ることができる。
異なる \fICURRENT\fR バージョンのライブラリや
異なる \fB\-release\fR のライブラリはバイナリ非互換であろう。
.SH インターフェースの設計
良いライブラリインターフェースを書くには、
練習とライブラリが解決しようとしている問題に対する徹底的な理解が必要である。
良いインターフェースを設計すれば、
頻繁に変更する必要はなく、ドキュメントを更新し続ける必要もなく、
クライアントがライブラリの使い方を再び勉強し続ける必要もないだろう。
設計に対するガイドラインをいくつか示す:
\fB\(bu\fR 前もって計画を立てる
.br
エントリーポイントを頻繁に削除する必要がないように、
それぞれのインターフェースを最小にするようにしなさい。
\fB\(bu\fR インターフェースの変更を避ける
.br
もしインターフェースを再設計する必要があるならば、
クライアントが既に存在するコードを書き直す必要がないように、
互換性のある関数も残しておくようにしなさい。
\fB\(bu\fR 見えないデータタイプを使う
.br
クライアントがアクセスする必要のあるデータタイプの定義は少ない程良い。
可能ならば、関数がジェネリックポインタ
(内部データタイプにキャストすることが可能) を
受け付けるように設計しなさい。
クライアントに直接データを操作させるよりは、
アクセス関数を提供しなさい。
このようするとインターフェースを変更することなく
データ構造を自由に変更できる。
\fB\(bu\fR ヘッダファイルを使う
.br
それぞれのライブラリについて大域関数・大域変数をヘッダファイルに書いて
ライブラリのソースファイルにインクルードしておけば、
気づかずにインターフェースの変更をしてしまっても
コンパイラが知らせてくれるだろう。
\fB\(bu\fR 可能なときはいつでも\fB静的\fR (もしくは等価なもの) を使う
.br
ライブラリに大域関数が少ないほど、ライブラリは柔軟に変更できる。
\fB静的な\fR関数・変数は、クライアントがアクセスできないから
インターフェースの変更とはならないので、好きなだけ変更することができる。
.SH AUTOMAKE ルールの書き方
\fBlibtool\fR ライブラリのサポートは、
\fBLTLIBRARIES\fR プライマリのもとに実装されている。
プログラムを \fBlibtool\fR ライブラリにリンクするためには、
ライブラリ名を指定する \fIprogram\fB_LDADD\fR 変数を使うこと。
libtool に \fB\-static\fR といったオプションを渡すためには
\fIprogram\fB_LDFLAGS\fR を使うと良い。
\fBlibtool\fR ライブラリをビルドするには、
ライブラリ名を指定する \fIlib\fB_LTLIBRARIES\fR を使うこと。
\fBそして、たとえば、\fR\fBlibtool\fR に \fB\-version\-info\fR オプションを
渡すには \fIlib\fB_LDFLAGS\fR を使うこと。
次のセクションに例がある。
作業をするためには、パッケージにいくつかの基本的なファイルを入れたり、
\fBlibtoolize\fR を使う必要があるだろう。
\fBlibtool\fR スクリプトを直接インクルードしてはならない。
.TP
.B config.guess
標準システム名を推測しようとする。
.TP
.B config.sub
標準システム名を確認するサブルーチンスクリプト。
.TP
.B ltconfig
指示されたシステムについて libtool スクリプトを作成する。
.TP
.B ltmain.sh
基本的な libtool の機能を実装した一般的なスクリプト。
.SH モジュールのダイナミックロード
\fBlibtool\fR のダイナミックロード機能を使うためには、
\fBconfigure.in\fR のなかで \fBAM_PROG_LIBTOOL\fR より前に
マクロ \fBAC_LIBTOOL_DLOPEN\fR を使わなければならない。
さもなければ、\fBlibtool\fR はそのプラットホームには
ダイナミックロードのメカニズムがないと仮定して、
これをシミュレートしようとする。
このシミュレーション機能を使うためには、
実行ファイルをリンクするときに
\fB\-dlopen\fR と \fB\-dlreopen\fR フラグを使い、
ダイナミックロードするオブジェクトを宣言しなければならない。
\fBlibtool\fR はオブジェクトファイルをリンクし、
以下のような実行ファイルのシンボルテーブルを保持した
データ構造を作成する。
.sp
.RS
.nf
struct lt_dlsymlist { const char *NAME; lt_ptr_t ADDRESS; }
.fi
.RE
.sp
\fINAME\fR には、"fprintf" のような、シンボル名のアスキー文字列が保持される。
\fIADDRESS\fR は、&fprintf のような、
適切なオブジェクトへのジェネリックポインタである。
.sp
.RS
.nf
const lt_dlsymlist * lt_preloaded_symbols;
.fi
.RE
.sp
この配列は実行ファイルにリンクされている
プリロードされたシンボルを表す。
\fB\-dlpreloaded\fR されたファイルのそれぞれについて要素が存在し、
ファイル名 \fINAME\fR と `\fB0\fR' というアドレス \fIADDRESS\fR、
およびこのファイルからエクスポートされたすべてのシンボルを保持する。
実行ファイル自身については、特別な名前 \fB@PROGRAM@\fR が使われる。
最後のエレメントは \fINAME\fR と `\fB0\fR' という \fIADDRESS\fR を持つ。
ダイナミックロードされるライブラリもしくは、
モジュールをダイナミックロードしようとする実行ファイルをリンクするときは、
\fB\-module\fR フラグを指定するのを忘れないこと。
ダイナミックロードしようとしているライブラリの外部シンボルを、
実行ファイルが参照する必要がある場合は、実行ファイルをリンクするときに
\fB\-export\-dynamic\fR を使用すること。
ライブラリ名にバリエーションがあるので、
プログラムはどれがダイナミックロードするための
正しいファイルであるのかを決定する必要がある。
直接的な方法は `\fB.la\fR' ファイルを調べて、
\fBdlname='\fIDLNAME\fB'\fR という行を探すことである。
この行はライブラリをダイナミックロードできない場合は空で、
そうでない場合はライブラリの名前が入っている。
.SH 例
ソースファイル `foo.c', `bar.c' から `libbaz' とよばれるライブラリを作成し、
次に `a' という名前の実行ファイルを作成するために `a.c' を `libbaz' と
リンクしようといる。
.SS ライブラリの作成
\fB\(bu\fR コンパイルモード:Linux は共有ライブラリをサポートしているので、
\fBlibtool\fR は 2 つのオブジェクトファイル、
一つは静的ライブラリ (`foo.lo')、
もう一つは共有ライブラリ (`foo.o') を作成する。
ソースファイル自身へのリンクをコンパイラにやらせたくないので、
\fB\-c\fR オプションは必須である。
.sp
.RS
.nf
lightside:~% libtool cc \-c foo.c
cc \-c \-fPIC \-DPIC foo.c -o .libs/foo.lo
cc \-c foo.c >/dev/null 2>&1
lightside:~% libtool cc -c bar.c
cc \-c \-fPIC \-DPIC bar.c -o .libs/bar.lo
cc \-c bar.c >/dev/null 2>&1
.fi
.RE
.sp
\fB\(bu\fR リンクモード、静的ライブラリのみをビルドする:
以前に作成された `.o' というオブジェクトファイルを指定している。
\fB\-o\fR オプションは必須である。
.sp
.RS
.nf
lightside:~% libtool cc -o libbaz.a foo.o bar.o
ar cru libbaz.a foo.o bar.o
ranlib libbaz.a
.fi
.RE
.sp
\fB\(bu\fR リンクモード、静的ライブラリと共有ライブラリをビルドする:
`.lo' というオブジェクトファイルを指定する。
必須オプションは、前と同じ \fB\-o\fR と
ライブラリのインストールされるディレクトリを指示する \fB\-rpath\fR である。
ライブラリは `.libs' ディレクトリに作成される。
.sp
.RS
.nf
lightside:~% libtool cc \-o libbaz.la foo.lo bar.lo \e
\-rpath /usr/local/lib
cc \-shared \-Wl,\-soname \-Wl,libbaz.so.0 \e
\-o .libs/libbaz.so.0.0.0 foo.lo bar.lo
(cd .libs && ln \-s libbaz.so.0.0.0 libbaz.so.0)
(cd .libs && ln \-s libbaz.so.0.0.0 libbaz.so)
ar cru .libs/libbaz.a foo.o bar.o
ranlib .libs/libbaz.a
creating libbaz.la
(cd .libs && ln \-s ../libbaz.la libbaz.la)
.fi
.RE
.sp
\fB\(bu\fR インストールモード:ライブラリを指定したパス
(この場合は `/usr/local/lib') にインストールするために
必要なコマンドを実行する。
このモードでは共有ライブラリ (`.so') と静的ライブラリ (`.a') を
インストールするとともに、アンインストールと情報提供の目的で
libtool ファイル (`.la') がインストールされる。
このモードはふつう特権ユーザーとして実行されるので、
\fB\-n\fR または \fB\-\-dry\-run\fR オプションを
指定して結果をチェックしておくとよい。
.sp
.RS
.nf
lightside:/tmp% libtool \-n install libbaz.la /usr/local/lib
install .libs/libbaz.so.0.0.0 /usr/local/lib/libbaz.so.0.0.0
(cd /usr/local/lib && ln \-s libbaz.so.0.0.0 libbaz.so.0)
(cd /usr/local/lib && ln \-s libbaz.so.0.0.0 libbaz.so)
install libbaz.la /usr/local/lib/libbaz.la
install .libs/libbaz.a /usr/local/lib/libbaz.a
ranlib /usr/local/lib/libbaz.a
chmod 644 /usr/local/lib/libbaz.a
.fi
.RE
.sp
.SS 実行ファイルの作成
最初に `a.c' をコンパイルする
.sp
.RS
.nf
cc \-c a.c
.fi
.RE
.sp
ライブラリが既にインストールされている場合には、
普段のように続行することができる
.sp
.RS
.nf
cc a.c \-lbaz \-L/usr/local/lib
.fi
.RE
.sp
ライブラリがまだインストールされていない場合は、
実行ファイルのリンク・デバッグ・インストールに
\fBlibtool\fR を使用しなければならない
(一度ライブラリがインストールされるまで、これはつづく)。
実際の実行ファイルはインストールされるまで `.libs' 内にあり、
作業ディレクトリにある実行ファイルは単なるラッパーであることに注意すること。
曖昧さを避けるため、絶対に
\fB\-l\fR と \fB\-L\fR を使ってアンインストールされた
共有ライブラリにリンクしてはならない。
`.la' ファイルへのパスだけを指定すること。
以下の (`\-lm') でわかるように、インストール済みのライブラリは問題ではない。
.sp
.RS
.nf
lightside:~% libtool cc a.o libbaz.la \-o a -lm
cc a.o \-Wl,\-\-rpath \-Wl,/usr/local/lib \e
.libs/libbaz.so \-o .libs/a -lm
lightside:~% libtool gdb a
[複雑なデバッグのセッションは省略]
lightside:~% libtool install \-c a /usr/local/bin/a
install \-c .libs/a /usr/local/bin/a
.fi
.RE
.sp
.SS Makefile.am の作成
\fB\(bu\fR\ 最初に簡単な \fBconfigure.in\fR を作成し、
\fBautomake\fR と \fBlibtool\fR のためのマクロを忘れずに追加する。
.sp
.RS
.nf
AC_DEFUN(AM_INIT_AUTOMAKE)
AC_INIT(a.c)
AM_INIT_AUTOMAKE(a, 1.0)
AC_PROG_CC
AM_PROG_LIBTOOL
AC_OUTPUT(Makefile)
.fi
.RE
.sp
\fB\(bu\fR\ 対応する \fBMakefile.am\fR
.sp
.RS
.nf
# ライブラリのビルド
lib_LTLIBRARIES=libbaz.la
libbaz_la_SOURCES = foo.c bar.c
libbaz_la_LDFLAGS = -version-info 0:0:0
bin_PROGRAMS = a a.debug
# a.c と libbaz.la から a をビルド
a_SOURCES = a.c
a_LDADD = libbaz.la
# 静的デバッグバージョンを作成
a_debug_SOURCES = a.c
a_debug_LDADD = libbaz.la
a_debug_LDFLAGS = \-static
.fi
.RE
.sp
\fB\(bu\fR\ そして最後に実行する
.sp
.RS
.nf
lightside:~% aclocal; libtoolize; automake \-\-add\-missing; autoconf
lightside:~% ./configure; make
.fi
.RE
.sp
.SH 関連項目
\fBlibtoolize\fR(1), \fBlibltdl\fR(3)
.SH 注意
プログラムのバグについては <bug-libtool@gnu.org> へ報告してください。
.br
この man ページは Ragnar Hojland Espinosa
<ragnar@ragnar-hojland.com> が作成しました。
|