0

本を読んでいると、次のように書かれてい
ます。プログラムの構文を調べた後、C++コンパイラは.objファイルを作成します。次に、コンパイラは、.objファイル内のプログラムステートメントをprintf()などのいくつかの関数と組み合わせるリンカーを呼び出します。

関数は.objファイルの一部ではありませんか?彼らは声明ではありませんか?
リンカは「静的リンク」および「動的リンク」という用語と関係がありますか?

動的リンクは実行時に解決されることは知っていますが、この本によると、リンカーはコンパイル時に呼び出されます。

4

2 に答える 2

1

で定義されている関数.cppは、対応する に存在します.obj。使用されているが定義されていない関数 ( のような標準ライブラリ関数などprintf) は、その一部ではありません。リンカは、他の.objライブラリとの参照を解決します。

  • 静的ライブラリは単なるコレクションで.objあり、リンカー.objは必要なシンボルを提供する を取得して実行可能ファイルに配置します。

  • 動的ライブラリは実行可能ファイルに入れられません。実行可能ファイルはそれらを参照しているとマークされ、実行可能ファイルの開始時に検出されます。(少なくとも主な用途では、プラグインにも使用される可能性があり、プロセスが要求したときに検索されます)。

于 2012-08-14T15:07:33.403 に答える
0

技術的には、リンカーによって行われる「動的リンク」のようなものは実際にはありません。実際には、実行時にコードの一部に手動でバインドするだけで、リンカーとはまったく関係ありません。

たとえば、Windows では dll を処理する方法がいくつかあります。

  1. 最も低いレベルの解決策は、LoadLibrary または AfxLoadLibraryを使用して名前で関数に手動でアクセスし、それらを適切な型の関数ポインターにキャストすることです。

  2. import libを使用できます。これにより、リンカはリンク時に他の dll の関数を解決できます。そのため、dll 内の関数を直接呼び出すことができます (つまりFoo()、クライアント コードで言うだけです)。LoadLibraryただし、これらの関数は、上記のメソッドの単なるラッパーです。ロードされていない場合は dll をロードし、そのライブラリ内の関数ポインタに直接アクセスしてから、その関数を実行します。

于 2012-08-14T15:07:12.550 に答える