2016-10-01 11 views
0

Visual Studioにはデフォルトでkernel32.dll、user32、dll、winspool.libなどの追加の依存関係が含まれているのはなぜですか?Windows C++でkernel32.dll、user32.dllなどをリンクする必要があるのはなぜですか?

なぜこれらのリソースはWindows上のC++プロジェクトにリンクされる必要があり、実際にはマシンコードに変換され、各実行ファイルに直接挿入されるか、実行可能ファイルとは別に保持され、実行時にリンクされます?

+0

も参照してください。https://en.wikipedia.org/wiki/Dynamic-link_library –

+0

ありがとう、とても役に立ちました。このページは、DLLがリンク時または実行時に実際の実行可能ファイルにロードされたかどうかで、状況によってはどちらかになる可能性があるという2番目の質問に答えるのにも役立ちます。http://stackoverflow.com/質問/ 3573475/how-does-the-import-library-work-detailsを参照してください。 –

+0

いいえ、リンク時に実行可能ファイルにDLLがロードされることはありません。リンクしている質問の回答は誤解を招きます。彼らは、DLLがプロセススタートアッププロシージャの一部としてロードされるときのロード時の動的リンクと、アプリケーションのコードがDLLを明示的にロードする実行時の動的リンクとの区別について話しています。紛らわしいことに、負荷時の動的リンクは、しばしば「静的リンク」と呼ばれますが、これは誤解です。 –

答えて

3

C++アプリケーションをウィンドウで実行するには、少なくともいくつかのシステムサービスが必要です。たとえば、メモリを確保して解放する必要があり、呼び出されたコマンドラインパラメータを取得する必要があり、実行後にオペレーティングシステムを終了できる必要があります。通常は、GUI経由でもコンソール経由でも、ファイルシステム上のファイルを読み書きするだけで、何らかの入力を受けて出力を生成する必要があります。

これらのサービスはどれも、魔法によって提供されていません。それらのすべてがkernel32.dll、user32.dllなどで提供されます。

ほとんどのC++プログラムでは、これらのDLLをほとんどすべてリンクする必要があります。

理論的には、これらのDLLが必要ないように自己完結型のプログラムを書くことは可能かもしれませんが、そのようなプログラムは事実上何もできません。一度ロードすると、どんなインプットをも受け取ることも、アウトプットを生み出すこともなく、内在的な考え方を単独で行うこと。したがって、実用的な目的のために、そのプログラム以外の誰もプログラムが実際に実行されたことを知ることはありません。

関連する問題