35

私の問題を説明するために、簡単なリンクの使用法から始めたいと思います。共有ライブラリlibz.dll z(D:/libs/z/shared/libz.dll) または静的ライブラリ libz.a (D:/libs/z/static/libz. a)。

それに対してリンクしたい場合は、次のようにします。

gcc -o main.exe main.o -LD:/libs/z/static -lz

このドキュメントによると、gcc は libz.a を検索します。

メンバがオブジェクト ファイルであるアーカイブ ファイル

次のこともできます。

gcc -o main.exe main.o -LD:/libs/z/shared -lz

-lフラグが を検索することは、上記のドキュメントには記載されていませんlib<name>.so

libz.a と libz.dll を同じディレクトリに置くとどうなりますか? ライブラリはどのようにプログラムとリンクされますか? フラグが必要な理由-Wl,-Bstatic-Wl,-Bdynamicif-lが共有ライブラリと静的ライブラリの両方を検索するのはなぜですか?

共有ライブラリ配布物をコンパイルする場合、一部の開発者が同じモジュールに対して .a ファイルと .dll ファイルを提供するのはなぜですか?

たとえば、Qt は bin ディレクトリに .dll ファイルを、lib ディレクトリに .a ファイルを提供します。同じライブラリですが、それぞれ共有と静的のように構築されていますか? または、.a ファイルは、実際のライブラリの実装がある共有ライブラリとのリンクを提供するある種のダミー ライブラリですか?

もう 1 つの例は、Windows の OpenGL ライブラリです。すべてのコンパイラが MingW の libopengl32.a のような静的 OpenGL ライブラリを提供しなければならないのはなぜですか?

拡張子が .dll.a および .la のファイルは何に使用されますか?

PSここにはたくさんの質問がありますが、それぞれが前のものに依存していると思います。それらをいくつかの質問に分割する必要はありません.

4

1 に答える 1

33

ld と WIN32 (cygwin/mingw)をご覧ください。特に、LD の Windows ポートでのフラグの動作に関する詳細については、dll セクションへの直接リンクを参照してください。-lエキス:

たとえば、引数 -lxxx を指定して ld を呼び出すと、検索パスの最初のディレクトリで次の場所を検索しようとします。

libxxx.dll.a
xxx.dll.a
libxxx.a
cygxxx.dll (*)
libxxx.dll
xxx.dll

検索パスの次のディレクトリに移動する前に。

(*) 実際には、これはありませんcygxxx.dllが、実際には<prefix>xxx.dll<prefix>は ld オプションで設定されます-dll-search-prefix=<prefix>。cygwin の場合、標準の gcc スペック ファイルには が含まれ-dll-search-prefix=cygているため、実質的には を検索しcygxxx.dllます。

注: MinGW を使用して Boost をビルドしたことがある場合は、Boost ライブラリの命名が上記のリンクで説明されているパターンに正確に従っていることを思い出すでしょう。

以前、MinGW には への直接リンクに関する問題があったため、代わりにからエクスポートされたシンボル*.dllを使用してスタティック ライブラリを作成し、それに対してリンクすることをお勧めしました。この MinGW wiki ページへのリンクは現在無効になっているため、直接リンクしても問題ないと思います。さらに、最新の MinGW-w64 ディストリビューションで自分で数回実行しましたが、まだ問題はありませんでした。lib*.a*.dll*.dll

リンク フラグが必要です。たとえば、同じ名前の動的ライブラリが検索パスにも存在する場合など、静的リンク-Wl,-Bstatic-Wl,-Bdynamic強制したい場合があるためです。

gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output

上記のスニペットは、-lflag のデフォルトのリンク優先度が に対してオーバーライドされることを保証しますMyLib1。つまりMyLib1.dll、 が検索パスに存在する場合でも、LD はlibMyLib1.aリンク先として選択します。MyLib2LD は再び動的バージョンを優先することに注意してください。

注:MyLib2に依存しているMyLib1場合はMyLib1、関係なく動的にリンクされます-Wl,-Bstatic(つまり、この場合は無視されます)。これを防ぐには、MyLib2静的にもリンクする必要があります。

于 2013-04-06T16:27:12.843 に答える