求大虾帮帮忙! gcc出现multiple definition of错误!!

我写了3个文件:matrix.h,matrix.c,main.c

其中matrix.h里定义了一些宏,数据结构和函数的声
明.matrix.c文件里是matrix.h里声明的函数的具体定义,main.c里是对matrix.c里的函数的测试,我是在linux下的
eclipse cdt建的工程,但编译的时候总是提示matrix.c文件里的所有函数重复定义!
文件结构大致是这样:
matrix.h:
extern int func();
matrix.c:
int func() { // multiple definition of 'func'
// body
}
main.c:
int main() {
//body
}
我的头文件matrix.h里只是声明了一下函数并没有定义!但当我把这些声明都删掉后再编译就没有这样的提示,我不明白是为什么?

声明函数都不可以了吗,我在头文件里也加了

#ifndef MATRIX_H_

#define MATRIX_H_

......

在网上找了很多,都没能解决!求高手帮帮我解决!!感激不尽!

extern int func();不要extern,你在main函数中加了#include "matrix.h"。声明又是extern,那么main函数中查找int func()函数就有两种路径了。1.通过包含的头文件。2.通过extern直接找到。所以找到两个int func()的定义。就报这个错误了。
gcc -I./ main.c matrix.c -o main -g3 -O0 -Wall //就默认这三个文件是属于同一个项目下了,所以extern就在main函数中生效了。追问

我在matrix.c中include了matrix.h,然后在main.c中include了matrix.c,这样还会冲突吗?
而且本来我是没加extern的,后来在网上搜了说这样可以解决,所以加的.

追答

既然你声明了int func()函数为extern。那么在matrix.c中int func()定义也是extern的。所以你在main函数中无论你包含matrix.h还是matrix.c都是一样的重复定义!

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-14
extern int func();

既然你已经在外面有了这个函数,这里就不用再定义一个了。
为啥要加extern 啊。追问

我把它去掉了,但还是不行

追答

你改一下
int func();


int func1();
如果没有问题,你一定能找到另一个同名函数。

我写的如下:

matrix.h
#ifndef _MATRIX_H_
#define _MATRIX_H_
int func();
#endif

matrix.c

#include "matrix.hpp"
int func()
{
return 0;
}

main

int main(int argc, char * argv[])
{
func();
return 0;
}
没有问题

第2个回答  2012-09-14
你为啥要加extern?追问

不加也一样

追答

晕 .C文件你怎么能include呢?

你只需要给个头文件提供索引,编译器会找到函数体的

第3个回答  2012-09-14
你有没有在matrix.h放什么全局变量?追问

没有

追答

不要在main.c中包含matrix.c,只包含头文件就可以了
gcc -o main main.c matrix.c

求大虾帮帮忙! gcc出现multiple definition of错误!!
extern int func();不要extern,你在main函数中加了#include "matrix.h"。声明又是extern,那么main函数中查找int func()函数就有两种路径了。1.通过包含的头文件。2.通过extern直接找到。所以找到两个int func()的定义。就报这个错误了。gcc -I.\/ main.c matrix.c -o main -g3 -O0 -Wall...

*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS 是什么意思
意思是重复定义,是一个程序运行出现的错误。出现该错误则是因为程序中某个变量重复定义,把头文件中的变量定义前加extern(只是变量声明不用初始化),再在某一个要调用该变量的c文件的程序之前再定义(注意第一个调用的c文件要负责附带初始化该变量,其他调用的c文件就不需要初始化过程啦)。

Linux系统下 连接器ld链接顺序的总结
gcc -L.\/ main.c -lA -lB 编译报错,在multiple definition of `XXX‘。重复定义函数。第二种情况:动动库 这个得看加载的顺序,上面说过,从左开始,按需加载。复制代码    代码如下:gcc main.c .\/libB.so .\/libA.so 复制代码    代码如下:gcc main....

gcc编译出现下面问题 我已经在每个头文件中添加了#pragma once,还是有...
pragma once 这只能在windows下面用,gcc就用头文件卫士了

用Linux编译C++代码出错了,求帮忙?错误为:collect2: error: ld returned...
这东西很烦,你是不是 .close()忘记括号了?

如何修改django端口(django调用接口)
vacuum:当服务器退出的时候自动清理环境,删除unixsocket文件和pid文件(trytoremoveallofthegeneratedfile\/sockets) 三、Nginx+uwsgi+Django 接下来,我们要将三者结合起来。首先罗列一下项目的所需要的文件: myweb\/ ├──manage.py ├──myweb\/ │├──__init__.py │├──settings.py │├──urls.py │...

在Cfree里为什么我正确的代码不能运行
看你的情况可能是编译环境设置不太对劲,主函数要有int型的返回。

ACM在线编译系统 Memory[KB] 、Time[MS] 、Lenght[Byte] 分别代表什么...
Time也分为墙上时间和cpu时间,在程序开始前记录时间,结束时再记下时间就能计算所用时间了。Lenght是你代码转换为文本后的大小。一般你都是将源程序文件上传,代码文件的大小就是Lenght。GCC有windows版本的,或者你也可以使用GCC标准的编译器MinGW,这些都是32位编译器。

ffmpeg 如何将MPEG2格式文件转换成h263++格式
ffmpeg直接支持h.263v1和h.263v2 由于v3只比v2进行了格式和小改进,没有本质区别或提升。99.9999%绝大多数情况可以使用v1或v2版本,同画质级别、同源的MPEG4 ASP编码更加适用。h.263和MPEG4 ASP都已经淘汰让位给h.264 假设音频不转的话 ffmpeg -i in.mpg -vcodec h263p -v:b 500k -acodec ...

什么是C++
编译错误。而在C++中,函数名相同而参数数据类型不同或个数不同或二者皆不同的两个函数被解释为重载。使用函数重载可以帮助程序员处理更多的复杂,避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称;同时在大型程序中,使函数名易于管理和使用,而不必绞尽脑汁地去处理函数名。同时必须注意,参数数据类型...

相似回答