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

Mat*_*llo 2 c linker gcc linker-errors

这真的是一个新手问题.我正在学习C,我不明白如何将不同的文件链接在一起.

我有一个标题

/* file2.h */

int increment(int x);
Run Code Online (Sandbox Code Playgroud)

和一个C文件

/* file2.c */

#include "file2.h"

int increment(int x)
{
    return x+1;
}
Run Code Online (Sandbox Code Playgroud)

现在我想要包含标题file1.c以便使用该函数increment.根据我的理解,我必须做以下事情:

/* file1.c*/

#include "file2.h"

int main()
{
    int y = increment(1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

gcc -o program file1.c
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息

/tmp/ccDdiWyO.o: In function `main':
file1.c:(.text+0xe): undefined reference to `increment'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

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

/* file1.c*/

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

int main()
{
    int y = increment(1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.

但是,如果我已经理解,只需要包含头文件(只包含声明).那么如何通知声明gcc的函数的定义是什么?incrementfile2.hfile2.c

Car*_*rum 7

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

$ gcc -o program file1.c file2.c
Run Code Online (Sandbox Code Playgroud)

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

$ gcc -c file1.c
$ gcc -c file2.c
$ gcc -o program file1.o file2.o
Run Code Online (Sandbox Code Playgroud)

但是,对于像这样复杂的东西,更好的是使用make.

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