使用头文件时未定义的符号错误

Chr*_*ngs 7 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
Run Code Online (Sandbox Code Playgroud)

main.c中:

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

main(){
    wtf();
}
Run Code Online (Sandbox Code Playgroud)

wtf.h:

void wtf();
Run Code Online (Sandbox Code Playgroud)

wtf.c:

void wtf(){
    printf("I never see the light of day.");
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我将整个函数包含在头文件中而不仅仅是签名中,那么它就符合要求,因此我知道wtf.h被包含在内.为什么编译器看不到wtf.c?或者我错过了什么?

问候.

qrd*_*rdl 12

你需要链接wtf你的main.最简单的方法将它们编译在一起 - gcc将为你链接'em,就像这样:

gcc main.c wtf.c -o main
Run Code Online (Sandbox Code Playgroud)

更长的方式(单独编译wtf):

gcc -c wtf.c
gcc main.c wtf.o -o main
Run Code Online (Sandbox Code Playgroud)

更长时间(单独的编译和链接)

gcc -c wtf.c
gcc -c main.c
gcc main.o wtf.o -o main
Run Code Online (Sandbox Code Playgroud)

而不是最后一次gcc调用,您可以ld直接以相同的效果运行.

  • @ j33r:据说没有什么能阻止_you_._We_,我们需要赚钱来编写C++代码才能谋生,然而,让我们的同事阻止我们这样做,以保护他们的理智.(如果你真的不知道:C的一个关键特性是_separate compilation_.除此之外它还允许我们处理包含预处理器文件的疯狂编译时间.然后还有信息隐藏,封装和其他不错的 - 不幸的是,经常被低估 - 原则.) (2认同)