すべてのプログラムには、コンパイルされた .exe または Java ファイルにライブラリのコピーが含まれていますか?
opengl.dll など、すべてのコンピューターにあるはずのライブラリについてはどうですか?
すべてのプログラムには、コンパイルされた .exe または Java ファイルにライブラリのコピーが含まれていますか?
opengl.dll など、すべてのコンピューターにあるはずのライブラリについてはどうですか?
プログラムのコンパイル方法とリンク方法 (ライブラリが静的にリンクされているか動的にリンクされているか) は、2 つの別個の問題です。これについては、C ファミリー言語について説明します。
プログラムは、データ型 (構造体) と関数 (プロトタイプ) の宣言を含むヘッダー ファイルを使用して、外部ライブラリに対してコンパイルされます。コンパイラは、これらの宣言を使用して、プラットフォームのアプリケーション バイナリ インターフェイス (ABI) を尊重する外部ライブラリへの呼び出しを発行できます。ABI は、構造体のレイアウト、呼び出し規則、名前マングリングなどを指定します。これは、プログラムとライブラリが通信するために同意する必要があるものです。コンパイルが完了すると、コンパイラはライブラリ関数への外部呼び出しを含むオブジェクト ファイルを出力します。
リンク時に、ライブラリを静的にリンクできます。つまり、ライブラリのコードのコピーが実行可能ファイルに統合されます (リンク時の最適化を使用する場合は、さらに最適化を実行できます)。そうしないと、プログラムの実行時にライブラリが動的にリンクされます。ダイナミック リンカーは、実行可能ヘッダー内の再配置情報を使用して、リンカーが外部ライブラリをロードしたアドレスでライブラリへの呼び出しにパッチを適用します。
動的リンクは、実行時に利用できるライブラリに依存しますが、同じ関数とデータ型を公開している限り、プログラムとは独立してライブラリを (セキュリティ修正などのために) 更新できるという利点があります。プログラムがライブラリ内の関数を実際に呼び出すまで動的リンクを遅らせることもできるため、プログラムをより迅速に起動できます。