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
最简单的方法是直接编译它们:
$ 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并获得更好的错误消息,更快的编译,并感觉您将来生活!