静的リンクと動的リンクまとめ

あるプログラムから別のライブラリを使用する場合のリンク方法ですが、一般的に以下の3つの方法があります。(.NETでは静的リンクは出来ません)

■静的リンク
ライブラリはコンパイル済みの別のファイルとして存在しますが、コンパイル時にプログラムの中に埋め込まれます。一般的に拡張子に.libと付けられスタティックリンクライブラリと呼ばれます。ライブラリとのリンクはコンパイル時に解決され、ライブラリのコードが丸ごとプログラムに埋め込まれるので、ファイルの配布はコンパイルされたExeファイル1つで済みます。

■動的リンク(起動時リンク)
ライブラリは別のファイルとして存在します。一般的に拡張子に.dllと付けられダイナミックリンクライブラリと呼ばれます。ライブラリとのリンクは起動時に解決されます。起動時にdllやdllの中に使用したい関数が存在しない場合はプログラム自体が起動しなくなります。動的リンクと言うくらいだから実行時に必要になった時に読み込むと思っていると残念な気持ちになります。反面、.dllが存在しないことが起動時に瞬時に分かります。参照設定やDllImport属性によるリンクはこれに当たります。ファイルの配布は、ライブラリとプログラムの両方を配布します。

そのアプリにとって絶対必要な機能の場合は、このリンク方式を取ることが一般的です。

■動的リンク(実行時リンク)
ライブラリは別のファイルとして存在します。一般的に拡張子に.dllと付けられダイナミックリンクライブラリと呼ばれます。起動時にdllやdllの中に使用したい関数が存在しない場合でもプログラムは起動することが出来ます。ですが、該当機能を利用するまでdllが存在しないことに気が付かず後で足りない事が分かったときに残念な気持ちになります。反面、dllを使用しない所は動かせることができます。System.Reflection .Assembly .LoadFrom やLoadLibraryによるリンクはこれに当たります。ファイルの配布は、ライブラリとプログラムの両方を配布します。一般的に、プログラミングの手間は起動時リンクより掛かります。

そのアプリにとって無くても特に困らない機能の場合、無くても縮退動作が可能な場合は、このリンク方式を取ることが一般的です。大量のDLLが存在し、普段一部のDLLしか利用しない場合もこちらの方式を取ります。

Win32 API を実行時に動的ロードする。(LoadLibrary,GetProcAddress,FreeLibrary)
http://d.hatena.ne.jp/tekk/20091018/1255880682