2013-04-06 35 views
22

私は自分の問題を説明するために簡単なリンクの使い方から始めたいと思います。共有ライブラリlibz.dll(D:/libs/z/shared/libz.dll)または静的ライブラリlibz.a(D:/ libs/z/static/libz)にコンパイルできるライブラリzがあるとします。 .a)。MinGWとの静的/動的/共有リンク

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

this documentationによると、gccはメンバーオブジェクトです

アーカイブファイルをあるlibz.aを検索します:

みましょう私は、私はこれを行う、それに対してリンクしたいですファイル

私はまた、次の操作を行うことができます

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

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

私はlibz.aとlibz.dllが同じディレクトリにあるとどうなりますか?ライブラリとプログラムとのリンク方法-lが共有ライブラリと静的ライブラリの両方を検索する場合、なぜフラグ-Wl,-Bstatic-Wl,-Bdynamicが必要ですか?

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

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

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

拡張子が.dll.aと.laのファイルは何ですか?

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

+0

cygwinの例を考えてみましょう:Cygwinでコンパイルされたプログラムでは、実行するには特定のDLLが必要です。 dllは特定のライセンス(空きライセンスの1つ)にバインドされており、プログラムのホストシステム上に存在する必要があります。開発者としてプログラムと共に出荷することを忘れた場合、プログラムは実行されません。もう1つの例は、バージョン競合するDLL(つまり、OpenGL)です。すべてのシステムは異なる機能を持ち、したがって特定のDLLの実装が異なります。したがって、開発者は正しいライブラリバージョン=>静的リンクを使用することを好むことがあります。 – scones

答えて

23

ld and WIN32 (cygwin/mingw)をご覧ください。特に、WindowsのLDポートで-lフラグの動作についての詳細は、のセクションへの直接リンクを参照してください。エキス:それは内の次のディレクトリに移動する前に、その検索パスの最初のディレクトリで、検索し

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

を試みます-lxxx LDが引数で呼び出される。例えば

、検索パス。

(*)実は、これはcygxxx.dllではなく、実際には<prefix>はLDオプション-dll-search-prefix=<prefix>によって設定されている<prefix>xxx.dll、です。 cygwinの場合、標準のgcc specファイルには-dll-search-prefix=cygが含まれているので、実際にはcygxxx.dllを検索します。

注:あなたがこれまでのMinGWとブーストを構築している場合は、おそらくBoostライブラリの命名は正確に上記のリンクで説明したパターンに従うことを思い出してください。

MinGWに直接接続して*.dllにリンクするという問題がありましたので、*.dllからエクスポートされたシンボルでスタティックライブラリを作成し、代わりにリンクすることをお勧めします。このMinGW wikiページへのリンクは今や死んでいるので、私は今すぐ*.dllと直接リンクするのがいいと思う。さらに、最新のMinGW-w64ディストリビューションで何回か自分でやっていましたが、問題はありませんでした。

同じ名を持つダイナミックライブラリはまた、検索パスに存在する場合、時にはあなたは、例えば、静的リンクを強制したいので、あなたは、リンクフラグ-Wl,-Bstatic-Wl,-Bdynamicが必要です

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

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

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

関連する問題