我有一个用C语言编写的项目,包括FIFO.h,FIFO.c,task.h,task.c和main.c(它是一个基本队列)。 当我在Windows下使用gcc编译我的main.c时,它编译并正常工作。但是,当我尝试在Eclipse中编译完全相同的代码时,每个函数都会出现以下错误:
一个例子是:
In function `queue_new':
FIFO\Debug/../src/QueueFIFO.c:20: multiple definition of `queue_new'
src\main.o:FIFO\Debug/../src/QueueFIFO.c:20: first defined here
src\FIFO.o:
老实说,我不知道你们可以使用哪些其他信息,所以请告诉我该怎么做。
main.c包括:
#include "FIFO.h"
#include "FIFO.c"
#include "task.h"
QueueFIFO.c:
#include "task.h"
FIFO.c:
#include "task.h"
#include "QueueFIFO.c"
task.c:
#include "task.h"
答案 0 :(得分:1)
您收到多个定义错误,因为您在.c
个文件中包含了.c
个文件。这是链接器的工作,以确保它们聚集在一起。好的做法是只在.h
文件中包含.c
个文件,并确保.h
文件不包含函数定义(仅限函数原型)。
通过#include
.c
个文件,您至少要定义两次函数:编译FIFO.c
时一次,main.c
时#include
FIFO.c
编译时将queue_new()
逐字复制到编译前的文本中。当谈到链接时间时,链接器会看到例如FIFO.o
和main.o
以及FIFO.c
中所有函数的多重定义barf中定义的#include
。
此外,正如其他人所提到的,请确保您“保护”您的头文件,以确保它们不会创建循环#ifndef
依赖项。您可以使用#define
和/* foo.h */
#ifndef FOO_H
#define FOO_H
#include "bar.h"
#include "baz.h"
/* header file contents go here */
#endif /* FOO_H */
执行此操作,如下所示:
{{1}}
这具有仅执行文件内容一次的效果,因为如果第二次包含FOO_H将被定义,并且将跳过整个文件。