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

主.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 回答