ベストアンサー
違いに移る前に、リンクプロセスの概要を見てみましょう。
リンカーを使用する理由
Cコード(またはその他の言語)を作成すると、.c形式で保存されます。
#include
int main(){
printf("quora");
return 0;
}
これで、このプログラムはコンパイルフェーズを通過します。ソースコードは機械語命令に変換されます。これらは、.oまたは.obj形式で保存されたオブジェクトファイルです。 2つの別々のファイルがある場合、2つの別々のobjファイルがあります。これらのファイルはプログラムの単なる翻訳です。これらのプログラムを実行するには、OSが実際に実行できる実行可能ファイルを生成する必要があります。この目的のために、リンカーを使用します。
これで、リンカーは多くのオブジェクトファイルから単一の実行可能ファイルを作成します。 Cプログラムでは、main()関数を使用しましたが、その定義はどこにありますか。コンパイラのスコープは1つのファイルのみに制限されているため、他のファイルで宣言および定義されている可能性のある参照は検索されません。
リンカーは、この「main()」関数定義について複数のファイルを検索し、それらをリンクします。さて、あなたの質問に来ます。
静的リンクと動的リンク:
- 静的リンク、すべてのライブラリモジュールが最終的な実行可能イメージにコピーされます。プログラムがロードされると、OSはソースコードと参照ライブラリの両方を含む単一のファイルのみをメモリに配置します。一方、ダイナミックリンクでは、外部ライブラリまたは共有ライブラリの名前のみがメモリに配置されます。動的リンクを使用すると、多くのプログラムで実行可能モジュールの単一コピーを使用できます。
- 静的リンクは、コンパイルの最終ステップでリンカーによって実行されます。 ダイナミックリンクは、実行時にOSによって実行されます。
- 静的にリンクされたファイルすべてのモジュールがすでにリンクされているため、より多くのディスクとメモリを消費します。ただし、ダイナミックリンクでは、参照モジュールのコピーが1つだけ保存され、多くのプログラムで使用されるため、メモリとディスク容量を節約できます。
- 静的リンクでは、外部ソースプログラムが変更された場合、それらを再コンパイルして再リンクする必要があります。ただし、動的リンクの場合は、1つのモジュールのみを更新して再コンパイルする必要があります。
- 静的にリンクされたプログラムは、動的リンクよりも高速です。
- 静的リンクファイルにはすべてのパッケージとモジュールが含まれているため、互換性の問題は発生しません。一方、ダイナミックリンクでは、ライブラリファイルが個別に保存されるため、互換性の問題が発生する可能性があります(たとえば、1つのライブラリファイルが新しいバージョンのコンパイラでコンパイルされるなど)。
- 静的にリンクされたプログラムは常に一定のロード時間を要しますが、動的にリンクされたプログラムでは時間が可変です。