error lnk2005解决办法

原:http://blog.sina.com.cn/s/blog_7b62c61c0100u09r.html


相信大家在写C语言头文件的时候都遇到过以下的错误(如果你没有遇到过,说明写的代码量还不够多哦):

Error error LNK2005:_structureTmp already defined inmain.obj structure.obj pageReplace
Error 
fatal error LNK1169: oneor more multiply defined symbols

问题的大概意思就是你对某些变量进行了重复的定义,出现这种错误的原因是你在头文件中定义了某个函数或是定义了某个变量,然后又在多个源文件中包含了这个头文件,结果系统在链接的时候就会报这种错误,如下面的代码

structure.h文件内容如下:

int i = 0;

int k;

int test();

int test1(){

   printf("test1");

}

 

structure.c文件如下:

#include <stdio.h>

#include "structure.h"

int test(){

   printf("test");

}

 

 

main.c文件如下

#include <stdio.h>

#include "structure.h"

int main(){

  

}

编译链接的时候会出现以下的错误:

Error error LNK2005: _test1already defined inmain.obj structure.obj headTest
Error 
error LNK2005: _i alreadydefined inmain.obj structure.obj headTest
Error 
fatal error LNK1169: oneor more multiply defined symbolsfound C:\Users\shangxuan\vc2008\headTest\Debug\headTest.exe 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 inti;

    这样再structure.c文件中定义了变量i后,在头文件中只需要时行外部变量申明,即可在引用该头文件

    的所有的源文件中使用变量i了

   最后,我想说的是,以上说的第一种方法,也就是#ifndef_INC_STRUCTURE #define_INC_STRUCTURE方法,也不是一点用没有,标准的c语言头文件应该以这样的语句开头,所以且不管它有没有用,大家在定头文件的时候最好加上以上语句,毕竟按照标准走,总没有坏处的

   如有疑问,可留言!!!!!!!!


猜你喜欢

转载自blog.csdn.net/baixiaozhe/article/details/70577669