0

C ライブラリはオブジェクト コードとリンクしています か、それとも最初にソース コードとリンクしていて、後でオブジェクト コードとリンクしていますか? つまり、 Cardiff School of Computer Science & Informatics の Web サイトにある画像を見て ください。

コンパイル処理

オブジェクトコードを生成した後、ライブラリがリンクされているのは「奇妙」です。つまり、インクルードを入れながらソースコードを使用します!

だから..これは実際にどのように機能しますか? ありがとう!

4

3 に答える 3

4

その図は正しいです。

ヘッダーを#include作成すると、基本的にそのヘッダーがファイルにコピーされます。ヘッダーは、型、関数宣言、定数などのリストですが、実際のコードは含まれていません (C++ およびインライン関数にもかかわらず)。

例を見てみましょう: library.h

int foo(int num);

library.c

int foo(int num)
{
    return num * 2;
}

yourcode.c

#include <stdio.h>
#include "library.h"
int main(void)
{
    printf("%d\n", foo(100));
    return 0;
}

#include library.hを実行すると、 の宣言が得られますfoo()この時点で、コンパイラは foo() やそれが何をするかについて他に何も知りません。foo()これにもかかわらず、コンパイラは呼び出しを自由に挿入できます。リンカは、foo()youcode.cでへの呼び出しを見て、 library.cでコードを見て、へのすべての呼び出しがfoo()そのコードに行くべきであることを知っています。

言い換えると、コンパイラは呼び出す関数をリンカに指示し、リンカは (すべてのオブジェクト コードを与えられて) その関数が実際にどこにあるかを認識します。

(修正のための Fiddleling Bits に感謝します。)

于 2014-08-05T20:16:58.867 に答える
3

ライブラリからのインクルードには、通常、ライブラリ インターフェイスのみが含まれます。そのため、最も単純なケースでは、ライブラリで提供される .h ファイルに関数宣言が含まれ、コンパイルされた関数はライブラリ ファイルにあります。そのため、ライブラリ ヘッダーから提供されたライブラリ関数宣言を使用してソースをコンパイルすると、リンカーはコンパイラ ライブラリ関数を実行可能ファイルに追加します。

于 2014-08-05T20:05:01.083 に答える