7

私は次のエラーを受け取り、私が間違っていることを一生理解することができません。

$ gcc main.c -o main

Undefined symbols:
  "_wtf", referenced from:
      _main in ccu2Qr2V.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

main.c:

#include <stdio.h>
#include "wtf.h"

main(){
    wtf();
}

wtf.h:

void wtf();

wtf.c:

void wtf(){
    printf("I never see the light of day.");
}

ここで、署名だけでなく関数全体をヘッダーファイルにインクルードすると、正常に準拠するため、wtf.hがインクルードされていることがわかります。コンパイラがwtf.cを認識しないのはなぜですか?それとも私は何かが足りないのですか?

よろしく。

4

2 に答える 2

13

とリンクする必要がありwtfますmain。一緒にコンパイルする最も簡単な方法 -gcc次のようにリンクします:

gcc main.c wtf.c -o main

長い道のり(別のコンパイルwtf):

gcc -c wtf.c
gcc main.c wtf.o -o main

さらに長い (個別のコンパイルとリンク)

gcc -c wtf.c
gcc -c main.c
gcc main.o wtf.o -o main

最後の呼び出しの代わりに、同じ効果で直接gcc実行できます。ld

于 2010-06-04T07:01:31.577 に答える
4

ヘッダーをインクルードするだけでは、ヘッダーで宣言されたものの実際の実装 (定義) がどこにあるかについてコンパイラーに何も伝えないという事実を見逃しています。

それらはインクルードを実行する C ファイルの隣にある可能性があり、事前にコンパイルされた静的リンク ライブラリ、または実行可能ファイルの読み取り時にシステム リンカーによって読み込まれた動的ライブラリから取得される可能性があります。プログラマー制御の明示的な動的ロード (dlopen()たとえば、Linux の関数ファミリー)。

C は Java とは異なります。C ファイルに特定のヘッダーが含まれているという理由だけで、コンパイラーはヘッダーで宣言されているものの実装を「魔法のように」見つけるために何かを行う必要があるという暗黙のルールはありません。あなたはそれを伝える必要があります。

于 2010-06-04T07:05:46.483 に答える