永发信息网

error LNK2005怎么解决

答案:1  悬赏:0  手机版
解决时间 2021-04-06 17:31
error LNK2005怎么解决
最佳答案
相信大家在写C语言头文件的时候都遇到过以下的错误(如果你没有遇到过,说明写的代码量还不够多哦):
Error 6 error LNK2005: _structureTmp already defined in main.obj structure.obj pageReplace
Error 7 fatal error LNK1169: one or more multiply defined symbols
问题的大概意思就是你对某些变量进行了重复的定义,出现这种错误的原因是你在头文件中定义了某个函数或是定义了某个变量,然后又在多个源文件中包含了这个头文件,结果系统在链接的时候就会报这种错误,如下面的代码
structure.h文件内容如下:
int i = 0;
int k;
int test();
int test1(){
printf("test1");
}

structure.c文件如下:
#include
#include "structure.h"
int test(){
printf("test");
}

main.c文件如下
#include
#include "structure.h"
int main(){

}
编译链接的时候会出现以下的错误:
Error 1 error LNK2005: _test1 already defined in main.obj structure.obj headTest
Error 2 error LNK2005: _i already defined in main.obj structure.obj headTest
Error 3 fatal error LNK1169: one or more multiply defined symbols found C:\Users\shangxuan\vc2008\headTest\Debug\headTest.exe 1 headTest
网上像这种问题说了很多解决办法,大部分都是说在头文件中加上一个标识,使得头文件在一个工程中只被引用一次,如将头文件改为:
#ifndef _INC_STRUCTURE
#define _INC_STRUCTURE

int i = 0;
int k;
int test();
int test1(){
printf("test1");
}

#endif
这样在链接的时候,一个工程中即使有该头文件的多次引用,实际上也只会引用一次,可是在这个工程中,大家不防加上这三行代码,再链接一下试试,发现问题依旧是存在的,说实话,这种问题当初也困扰了我一个下午,到网上也搜了很多的资料,可是大家的解决方法都是和上面的一样(郁闷,大家都互相抄袭),就是解决不了这个问题,自己以测试了很长时间,才发现错误的根源。
其实为了说明这类问题,我在上面的代码中有意的进行了比较,变量定义了两个,函数定义了两个,可是链接的时候其中一个变量和其中一个函数报发重复定义的错误,可是另个一个却没有,这就是问题的关键,因为变量i和函数test1在头文件中是进行了定义,而k和函数test在头文件中只是进行了申明,并没有定义,所以不会出现重定义的错误,说到这,大家应该知道如何解决这类问题了,那就是在头文件中永远只进行申明,不进行定义,这样这类问题就将不复存在
另外,大家也许想在头文件中申明一个变量,然后在多个源文件中可以使用这个变量,可是由于在头文件中不能对变量进行初始化,在源文件中引用势必会出现错误(基本数据类型的变量或许不会出现错误,可是如果是一个结构体啥的,基本是会出现错误的),那么如何解决这个问题呢,有两个办法:
1.正如上面所说的问题,在structure.c文件中直接对变量i赋值,然后在其它源文件中就可直接使用
2.变量的申明在structure.c时行,然后在structure.h文件中进行外部变量申明,方法为extern int i;
这样再structure.c文件中定义了变量i后,在头文件中只需要时行外部变量申明,即可在引用该头文件
的所有的源文件中使用变量i了
最后,我想说的是,以上说的第一种方法,也就是#ifndef _INC_STRUCTURE #define _INC_STRUCTURE方法,也不是一点用没有,标准的c语言头文件应该以这样的语句开头,所以且不管它有没有用,大家在定头文件的时候最好加上以上语句,毕竟按照标准走,总没有坏处的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
TATA的推拉门怎么样?用起来好吗?
手机短信提示音响了但未收到短信怎么办
覃进展得多少分
子曰:“学而时习之,不亦说乎?有朋自远方来
try(hd0,0):ntfs5:no wubildr try(hd0,1):ntf
形容脏的词语有些什么?
昂贵是什么意思,感情贵在专致,使终如一是什
下列地区与其主要土地利用类型连接正确的是A.
谁知道怎么写实验报告?有实验步骤的模板吗?
买房同贷书出来了为什么银行还没有放款
为什么说英超才是世界上最好看的联赛呢?
中秋节诗词佳句及出处,含意,创作背景
填空题把弯曲的公路改直可缩短里程,这根据的
求一本总裁言情小说,男主在咖啡厅喝咖啡,女
电视机一打开显HDMI1/MHL咋回事
推荐资讯
锂电池租赁怎么做
简述行为税的特点和功能
比较下列各句中“而”字的意义和用法,判断正
育婴室恐怖吗,育婴室电影好看吗谁给个谢谢
从A点到B点的最短线路共有几种
有关‘有志者事竟成’的名人事例
求解光大卡快一年,临时额度都提不了
2005年11月吉林某化工厂发生爆炸,大量苯类物
设x,y都是有理数,且满足方程:2x+根号3y=-6y-
电脑delete怎么设置
现在做烘焙师多少钱一个月,烘焙师的回答一下
为什么买回家的猪鼻龟养了一个月左右突然死了
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?