C 使用头文件时出现未定义符号错误

C 使用头文件时出现未定义符号错误,c,linker-errors,undefined-reference,undefined-symbol,C,Linker Errors,Undefined Reference,Undefined Symbol,我犯了下面的错误,我一辈子都搞不清楚自己做错了什么 $ 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();

我犯了下面的错误,我一辈子都搞不清楚自己做错了什么

$ 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();
}
void wtf();
void wtf(){
    printf("I never see the light of day.");
}
wtf.c:

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

main(){
    wtf();
}
void wtf();
void wtf(){
    printf("I never see the light of day.");
}
现在,如果我在头文件中包含整个函数,而不仅仅是签名,那么它符合要求,因此我知道包含了wtf.h。为什么编译器看不到wtf.c?还是我遗漏了什么


尊敬。

您需要将
wtf
与您的
main
链接。最简单的编译方法-
gcc
将为您链接它们,如下所示:

gcc main.c wtf.c -o main
更长的路(单独编译
wtf
):

甚至更长(单独编译和链接)


您可以直接运行
ld
,而不是上次的
gcc
调用,具有相同的效果。

您忽略了一个事实,即仅仅包含一个头并不能告诉编译器头中声明的内容的实际实现(定义)在哪里

它们可能位于执行include的文件旁边的C文件中,它们可能来自预编译的静态链接库,或者在读取可执行文件时由系统链接器加载的动态库,或者它们可能来自运行时用户程序员控制的显式动态加载(例如,Linux中的
函数族)


C与Java不同,没有隐含的规则,即仅仅因为C文件包含某个头文件,编译器就应该“神奇地”找到头文件中声明的内容的实现。您需要告诉它。

您从未告诉编译器编译wtf.c。这就是为什么。是的,我来自魔法和独角兽之地,所以我只是假设将实现命名为与头相同的名称将允许编译器同时找到这两个。你完全正确。我假设只要头文件和实现的名称相同,当我包含头文件时,编译器就会同时找到这两个文件。谢谢。那么是什么阻止我做下面的事情呢#include#include“wtf.h”#include“wtf.c”这让人感觉不舒服,但在运行gcc时必须为每个实现都包含一个参数的想法也是如此。@j33r:大概没有什么能阻止你。我们,我们需要赚钱写C++代码谋生,然而,我们的同事阻止我们这样做,以保护他们的理智。(如果你真的不知道的话:C的一个关键特性是独立编译。除其他外,它允许我们处理预处理器文件包含所带来的疯狂的编译时间。此外还有信息隐藏、封装和其他一些不错的原则,不幸的是,这些原则常常被低估。)@j33r:当您的程序有多个
.c
文件时,是时候编写一个简单的
Makefile
来构建它了。