私は自分の問題を説明するために簡単なリンクの使い方から始めたいと思います。共有ライブラリ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.ここにはたくさんの質問がありますが、私はそれぞれが前のものに依存していると思いますし、それらをいくつかの質問に分割する必要はありません。
cygwinの例を考えてみましょう:Cygwinでコンパイルされたプログラムでは、実行するには特定のDLLが必要です。 dllは特定のライセンス(空きライセンスの1つ)にバインドされており、プログラムのホストシステム上に存在する必要があります。開発者としてプログラムと共に出荷することを忘れた場合、プログラムは実行されません。もう1つの例は、バージョン競合するDLL(つまり、OpenGL)です。すべてのシステムは異なる機能を持ち、したがって特定のDLLの実装が異なります。したがって、開発者は正しいライブラリバージョン=>静的リンクを使用することを好むことがあります。 – scones