実行時に読み込まれ、複数のプログラムで共有できる形式のライブラリ。
動的ライブラリ(DLL=Dynamic Link Library のこと)とは、実行時に読み込まれ、複数のプログラムで共有できる形式のライブラリです(拡張子は .dll や .so)。実行ファイルの中には含めず、プログラムの起動時や使用時に読み込みます。
身近な例で考えると、図書館に置いてある辞書をみんなで使うのに似ています。各自が辞書を丸ごと書き写す(静的ライブラリ)のではなく、必要なときに棚から1冊を借りて引く。1冊を多くの人で使い回せるので場所を取りません。
上のツールで▶ボタンを押すと、実行ファイル本体だけを持った状態から、実行時にローダがDLLを読み込み、複数プロセスが同じDLLを共有するまでの流れを確認できます。
動的ライブラリは実行時に読み込まれます。読み込みを担当するのがローダ(=必要なファイルをメモリに運び込む読み込み担当)です。メモリ=コンピュータが作業に使う一時的な置き場のことです。
仕組みは次の流れで動きます。
・① 起動:実行ファイルを動かすと、ローダが必要なDLLを探す
・② ロード:DLLをメモリに読み込む
・③ 動的リンク:プログラムの関数呼び出しを、DLL内の実際のアドレス(置き場所)に結びつける
・④ 共有:別のプロセスも、すでにメモリにあるDLLをそのまま共有して使える
電話帳で名前から番号を調べてはじめて電話をかけられるように、動的リンクで呼び出し先を結びつけてはじめてDLLの関数が使えるようになります。1つのDLLを多くのプロセスで共有できるので、メモリの節約にもなります。
静的ライブラリと動的ライブラリは、ライブラリを組み込む(読み込む)タイミングが決定的に違います。静的はビルド時に組み込み(自己完結・大きい)、動的は実行時にロード(実行ファイルが小さい・更新が楽・メモリ共有できる)です。
| 項目 | 静的ライブラリ | 動的ライブラリ(DLL) |
|---|---|---|
| 組み込み時期 | ビルド(リンク)時 | 実行時にロード |
| 実行ファイル | 大きい(自己完結) | 小さい(本体のみ) |
| 更新 | 再ビルドが必要 | DLLの差し替えで完了 |
| メモリ共有 | できない(重複) | 複数プロセスで共有 |
| 弱点 | ファイルが肥大化 | DLL地獄 |
ただし動的ライブラリには弱点もあります。必要なDLLが見つからなかったり、想定と違うバージョンのDLLが読み込まれたりすると、プログラムが動かなくなります。これを俗に「DLL地獄」と呼びます。自己完結する静的ライブラリには、この問題が起きにくいという良さがあります。上のツールの最終ステップで、両者の違いをあらためて見比べてみてください。