C中的.h和.c文件之间的关系

时间:2011-04-23 09:54:30

标签: c linker

  

可能重复:
  What is a “translation unit” in C++

  

可能重复:   What is a "translation unit" in C++

x.h:

void f();

x.c:

void f(){}

main.c:

#include"x.h"
int main(){
    f();
}

然后我使用:gcc -o a.out main.c 为什么说f是未定义的符号?

5 个答案:

答案 0 :(得分:4)

这是一个链接器错误。您需要同时编译main.cx.c,或者单独编译而不链接并链接生成的目标文件。

例如:

gcc -o x.o -c x.c
gcc -o main.o -c main.c
gcc -o myexecutable main.o x.o

答案 1 :(得分:1)

这是因为x.h只包含一个声明,它不会定义一个符号。 x.c包含定义。

尝试

gcc -o a.out main.c x.c

答案 2 :(得分:0)

您还必须在x.c文件中包含x.h,并确保以下代码未使用该定义两次:

#ifndef X_H
#define X_H
f();
#endif

然后使用gcc -o a.out main.c x.c

答案 3 :(得分:0)

由于f中没有定义x.h,因此只会声明它。您需要将x.o链接到您的可执行文件中。如果您没有使用IDE,则可能需要设置Makefile来处理此问题,并调用make来构建项目。

答案 4 :(得分:0)

在编译期间应该这样说,但可能在链接期间。你还没有编译过x.c(gcc -c x.c)?