我遇到了一个经典错误,但仍然无法理解为什么会发生...
以下是简化说明 显然我有两个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文件。
提前致谢。
答案 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