注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

李建敏 廊坊师范学院信息技术提高班十二期

变是永远不变的

 
 
 

日志

 
 

C++ERROR LNK25005与LNK1169  

2015-06-28 09:41:27|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
   相信大家在写C语言头或C++文件的时候都遇到过以下的错误:

  Error error LNK2005: _structureTmp already defined in main.obj structure.obj pageReplace
  Error fatal error LNK1169: one or more multiply defined symbols

  问题的大概意思就是你对某些变量进行了重复的定义,出现这种错误的原因是:

 ( 

   1.在头文件中定义了某个函数或是定义了某个变量,然后又在多个源文件中包含了这个头文件,结果系统在链接的时候就会报这种错误,如下面的代码

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: _test1 already defined in main.obj structure.obj headTest
Error error LNK2005: _i already defined in main.obj structure.obj headTest
Error fatal error LNK1169: one or more multiply defined symbols found 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 int i;

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

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

   )

2.因为刚刚接触C++也没有完整的看一遍书便跟着视频敲例子,所以一些规则和逻辑性的错误也会导致这个问题的出现,即当一个文件运行完后当新建一个文件再次运行时会出现文件的罗列,导致了函数定义的重复,这些文件都是在一个工程里,这应该是文件和工程的区别,如果是这样导致这个错误只需关掉程序再次打开重新编译就好了

  评论这张
 
阅读(36)| 评论(5)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017