使用头文件时未定义的符号错误
我收到了以下错误,并且不能为我的生活弄清楚我做错了什么。
$ 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 #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? 或者我错过了什么?
问候。
你需要将wtf
与你的main
链接起来。 最简单的方法将它们编译在一起 – gcc
会为你链接’em,就像这样:
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
具有相同的效果。
您遗漏的事实是,仅仅包含一个标题并不会告诉编译器任何关于标题中声明的事物的实际实现(定义)的位置。
它们可以位于执行包含的文件旁边的C文件中,它们可以来自预编译的静态链接库,也可以来自系统链接器在读取可执行文件时加载的动态库,或者它们可以来自运行时用户程序员控制的显式动态加载(例如Linux中的dlopen()
函数系列)。
C不像Java,没有隐含的规则只是因为一个C文件包含某个头,编译器也应该做一些事情来“神奇地”找到头部声明的事情的实现。 你需要告诉它。