gcc链接器如何在包含文件中起作用

时间:2011-09-24 17:45:31

标签: c gcc linker linker-errors

这真的是一个新手问题。我正在学习C,我不明白如何联系在一起 不同的文件。

我有像

这样的标题
/* file2.h */

int increment(int x);

和一个C文件

/* file2.c */

#include "file2.h"

int increment(int x)
{
    return x+1;
}

现在我想在file1.c中加入标题,以便使用函数increment。 根据我的理解,我必须做一些事情:

/* file1.c*/

#include "file2.h"

int main()
{
    int y = increment(1);
    return 0;
}

但是当我尝试编译整个事情时,使用

gcc -o program file1.c

我收到类似

的错误消息
/tmp/ccDdiWyO.o: In function `main':
file1.c:(.text+0xe): undefined reference to `increment'
collect2: ld returned 1 exit status

但是,如果我还包括file2.c

/* file1.c*/

#include "file2.h"
#include "file2.c"  /* <--- here it is! */

int main()
{
    int y = increment(1);
    return 0;
}

一切都按预期工作。

但是,如果我只理解头文件(只包含声明),则必须包括在内。那么如何通知gcc increment中声明的函数file2.h的定义是file2.c

2 个答案:

答案 0 :(得分:7)

最简单的方法是直接编译它们:

$ gcc -o program file1.c file2.c

但是对于更复杂的系统,您可能希望分步进行。这是一个简单的命令行配方:

$ gcc -c file1.c
$ gcc -c file2.c
$ gcc -o program file1.o file2.o

对于像这样复杂的事情,更好的方法是使用make

除了您的具体问题,您为什么使用GCC?您可以使用clang并获得更好的错误消息,更快的编译,并感觉您将来的生活!

答案 1 :(得分:2)

gcc -o program file2.c file1.c

这将编译file1.c和file2.c并将它们链接在一起。