5

今のところ、次の質問を自分で実験して整理する環境がないため、申し訳ありません。

1) 4 つのライブラリ ファイルがあるlibmylib_super.aとします。リンクするライブラリを指定する際、次のアプローチの違いは何ですか:libmylib_super.somylib_dumb.amylib_dumb.so

A) -l:libmylib_super.a
B) -llibmylib_super
C) -lmylib_super
D)-lmylib_dumb

-static2)マニュアルページからの定義:

動的リンクをサポートするシステムでは、これにより共有ライブラリとのリンクが妨げられます。他のシステムでは、このオプションは効果がありません。

このリンカ オプションは質問 1 と関係がありますか? それとも……ひょっとして、お互いに干渉しあう?

ありがとう。

--- 2009-12-28 編集 ---

Boost date_time ライブラリにリンクすることで、環境を整えて少し実験しました。libboost_date_time-mt-d.a、、(シンボリック リンク)の3 つのライブラリ ファイルがあるとしますlibboost_date_time-mt-d.so.1.41.0libboost_date_time-mt-d.so -> libboost_date_time-mt-d.so.1.41.0

A.1) -l:libboost_date_time-mt-d.a==> リンク OK、ライブラリ ファイルがなくてもバイナリは動作します。
A.2) ==>リンク エラー-l:libboost_date_time-mt-d.aあり-static /usr/bin/ld: cannot find -lm

C.1) -lboost_date_time-mt-d==> リンク OK、バイナリは動作しますが、共有ライブラリ ファイルが必要です。
C.2) ==>リンク エラー-lboost_date_time-mt-dあり-static /usr/bin/ld: cannot find -lm

A.2 と C.2 のエラーについて何か考えはありますか?

さらに、C.1でプログラムを実行している間、共有ライブラリファイルを名前で検索しているように見えますlibboost_date_time-mt-d.so.1.41.0が、libboost_date_time-mt-d.so. プログラムがライブラリの正確なバージョンのないシステムで実行されている場合、それは不便ではないでしょうか? 共有ライブラリを使用しているときにバージョンを処理する実用的な方法は何ですか?

4

1 に答える 1

9

説明書によると、

A) 正確に名前が付けられたファイルのライブラリ パスを検索しますlibmylib_super.a(共有ライブラリ動作の最初の検索は適用されません)。

liblibmylib_super.soB)最初に名前が付けられたファイルのライブラリパスを検索するか、使用されている場合は名前がliblibmylib_super.a付けられたファイルのみを検索します-プレフィックスとファイル拡張子を追加するのはリンカーであることに注意してくださいliblibmylib_super.a-staticlib

C) ライブラリ パスでlibmylib_super.so最初に指定されたファイルを検索し、次に指定さlibmylib_super.aれたファイルのみを検索liblibmylib_super.soする-static

D) C) を参照

libライブラリ名にプレフィックスを追加する必要があるのはリンカーであるため、B) は機能しないことに注意してください。

mylib_dumb命名規則に従っていないため、D) は機能しないことに注意してください。

GNU リンカー マニュアルを参照してください。

-l namespec

--library=namespec

namespec で指定されたアーカイブまたはオブジェクト ファイルを、リンクするファイルのリストに追加します。このオプションは何度でも使用できます。namespec が :filename の形式の場合、ld は filename というファイルのライブラリ パスを検索します。それ以外の場合は、libnamespec.a というファイルのライブラリ パスを検索します。

共有ライブラリをサポートするシステムでは、ld は libnamespec.a 以外のファイルも検索する場合があります。具体的には、ELF および SunOS システムでは、ld は、libnamespec.a という名前のライブラリを検索する前に、libnamespec.so という名前のライブラリのディレクトリを検索します。(慣例により、拡張子 .so は共有ライブラリを示します。) この動作は、常に filename というファイルを指定する :filename には適用されないことに注意してください。

リンカーは、コマンド ラインで指定された場所で、アーカイブを 1 回だけ検索します。アーカイブが、コマンド ラインでアーカイブの前に表示されたオブジェクトで未定義のシンボルを定義している場合、リンカーはアーカイブから適切なファイルをインクルードします。ただし、後でコマンド ラインに表示されるオブジェクト内の未定義のシンボルによって、リンカーがアーカイブを再度検索することはありません。

リンカーにアーカイブを複数回検索させる方法については、 -( オプションを参照してください。

コマンドラインで同じアーカイブを複数回リストすることができます。

このタイプのアーカイブ検索は、Unix リンカの標準です。ただし、AIX で ld を使用している場合は、AIX リンカの動作とは異なることに注意してください。

于 2009-12-27T11:50:35.417 に答える