C包括错误多重定义错误

时间:2013-11-04 06:56:57

标签: c include

我遇到了一个经典错误,但仍然无法理解为什么会发生...

以下是简化说明 显然我有两个C文件main.c和support.c

在support.c中我有一个函数void bla(int input);

在main.c中我有几个函数使用来自support.c的bla,我包含了

#include<support.c> 

位于main.c的顶部

但是我无法编译项目,因为bla的错误多重定义,首先在这里定义(eclipse指向support.c中bla的定义)

我最了解我必须创建头文件support.h并在那里给出原型extern void bla(int input),但为此我必须包含.c文件。

提前致谢。

3 个答案:

答案 0 :(得分:2)

预处理器将复制support.c的内容,并将其粘贴到main.c以替换行#include<support.c>。因此,函数bla有两个定义,一个在support.c,另一个在main.c

解决方案是,不要包含源文件。将要导出的函数的声明放在头文件support.h中,并将头文件包含在main.c中:

#include "support.h"

答案 1 :(得分:2)

您不会将源文件包含在其他源文件中。而是创建一个包含声明函数的头文件(扩展名为.h),即函数原型。然后分别构建两个源文件,并将它们链接在一起以形成最终的可执行文件。

所以头文件support.h就像

一样
#ifndef SUPPORT_H
#define SUPPORT_H

void blah(void);

#endif

(预处理器#ifdef / #define / #endif内容适用于include guards,以防止多个包含在同一源文件中。)

然后是support.c源文件

#include "support.h"

void blah(void)
{
    /* Some code here... */
}

最后是main.c源文件

#include "support.h"

int main(void)
{
    blah();
    return 0;
}

如果您有一个IDE(如Visual Studio),如果将这些文件添加到项目中,IDE将确保所有内容都已构建并正确链接。如果要在命令行上进行编译,请将每个源文件编译为目标文件(通常使用类似-c的选项(用于GCC和clang)),然后将两个目标文件链接在一起以创建可执行文件。


GCC的命令行示例:

$ gcc -Wall -c main.c -o main.o
$ gcc -Wall -c support.c -o support.o
$ gcc main.o support.o -o my_program

以上三个命令将首先将源文件编译为目标文件,然后将它们链接在一起。

答案 2 :(得分:1)

您使用的是什么编译器?

编译时,请确保执行以下操作:

gcc main.c support.c -o yourProgram