[解決済み】「静的リンク」「動的リンク」の意味とは?
質問
静的にリンクされた」「動的にリンクされた」という言葉をよく耳にします。 C , C++ または C# . これらは一体何なのか、何について話しているのか、そして何にリンクしているのか?
どうやって解決するの?
ソースコード(書いたもの)から実行コード(実行するもの)になるには、(インタプリタ型コードを除けば)ほとんどの場合、2つの段階があります。
1つ目はコンパイルで、ソースコードをオブジェクトモジュールに変換します。
2つ目のリンクは、オブジェクト・モジュールを結合して実行ファイルを形成するものです。
この区別は、特に、サードパーティのライブラリをソースコードを見ることなく実行ファイルに含めることができるようにするため(データベースアクセス、ネットワーク通信、グラフィカルユーザーインターフェースのためのライブラリなど)、あるいは異なる言語のコード(例えばCとアセンブリコード)をコンパイルして、それらをすべてリンクするために行われるものである。
あなたが 静的 ファイルを実行ファイルにリンクする場合、そのファイルのコンテンツはリンク時に含まれます。言い換えれば、ファイルの内容は、実行する実行ファイルに物理的に挿入されます。
リンクするとき 動的に の場合、リンク先のファイルへのポインタ(ファイルのファイル名など)が実行ファイルに含まれ、リンク時には当該ファイルの内容は含まれません。それは、後で 実行 また、これらのファイルはディスク上のものではなく、実行可能ファイルのインメモリコピーにのみ組み込まれます。
基本的にはディファード・リンクという方法です。さらに より は、実際にその中の関数を呼び出そうとするまで、ダイナミックリンクされたファイルを取り込まないという、遅延方法(システムによってはレイトバインディングと呼ばれます)です。
静的にリンクされたファイルは、リンク時に実行ファイルに「ロック」されるため、決して変更されることはありません。 実行ファイルから参照される動的リンクされたファイルは、ディスク上のファイルを置き換えるだけで変更可能です。
このため、コードを再リンクすることなく、機能の更新が可能です。ローダーは実行するたびに再リンクします。
これは良いことでもあり悪いことでもあります。一方ではアップデートやバグフィックスが容易になる一方で、アップデートに互換性がないとプログラムが動作しなくなる可能性があります。これは、一部の人が言及する、ダイナミックリンクされたライブラリを互換性のないものに置き換えるとアプリケーションが壊れるという恐ろしい「quot; DLL hell"」の原因でもあります(ところで、これを行う開発者は追い詰められて厳しく罰せられると思って下さい)。
として
例
をコンパイルする場合を見てみましょう。
main.c
ファイルを静的リンクと動的リンクのために使用します。
Phase Static Dynamic
-------- ---------------------- ------------------------
+---------+ +---------+
| main.c | | main.c |
+---------+ +---------+
Compile........|.........................|...................
+---------+ +---------+ +---------+ +--------+
| main.o | | crtlib | | main.o | | crtimp |
+---------+ +---------+ +---------+ +--------+
Link...........|..........|..............|...........|.......
| | +-----------+
| | |
+---------+ | +---------+ +--------+
| main |-----+ | main | | crtdll |
+---------+ +---------+ +--------+
Load/Run.......|.........................|..........|........
+---------+ +---------+ |
| main in | | main in |-----+
| memory | | memory |
+---------+ +---------+
静的なケースでは、メインプログラムとC言語のランタイムライブラリがリンク時に(開発者によって)一緒にリンクされていることがわかります。ユーザーは通常、実行ファイルを再リンクすることはできないので、ライブラリの動作に縛られることになります。
動的なケースでは、メインプログラムはCランタイムのインポートライブラリ(動的ライブラリの中身を宣言するものだが、実際にはそうではない)とリンクされる。 定義 となります。) これにより、リンカーは実際のコードがなくてもリンクすることができます。
そして、実行時にオペレーティングシステムのローダーが、メインプログラムとC言語のランタイムDLL(ダイナミックリンクライブラリまたはシェアードライブラリ、その他の命名法)とのレイトリンクを行うのです。
C言語ランタイムの所有者は、アップデートやバグフィックスを提供するために、いつでも新しいDLLをドロップインすることができます。前述したように、これにはメリットとデメリットの両方があります。
関連
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み] 関数を終了するには?
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である