全局变量重复定义,fatal error LNK1169: 找到一个或多个多重定义的符号

1.在GlobeValue.h中定义了一个变量:

char gl_UID[256];

2.在b.cpp和e.cpp中分别引用GlobeValue.h,并且使用gl_UID的全局变量,

结果出现:fatal error LNK1169: 找到一个或多个多重定义的符号 的错误。

错误的原因:因为在gl_UID全局变量是在GlobeValue.h中定义的,所以呢,每次包含一次这个头文件时,相当于又定义了一个这样的变量。

正确的代码书写方法是:
在GlobeValue.h中使用extern char gl_UID,申明这个变量,在b.cpp中定义这个变量char gl_UID[256],在e.cpp中不需要定义。这样,每次包含这个头文件,遇到extern时,编译器就知道在别处存在这个变量了,就不会重新定义了。

时间: 2024-10-31 21:43:51

全局变量重复定义,fatal error LNK1169: 找到一个或多个多重定义的符号的相关文章

fatal error LNK1169: 找到一个或多个多重定义的符号

申明全局变量,全局函数一定要在cpp中申明,其他类引用该全局变量就include该cpp的h文件,然后extern一下就好了.否则容易出现该重复定义错误. 这个"容易"是如何解释的呢? 例如 A.h 中如果申明了全局变量 int Global; 在 B.h 中 include "A.h" ..... extern int Global; ...... 则你 include A.h 相当于把 A.h 中全局变量的申明也 include 进来了,编译器就会认为是重复定义

error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)

问题描述如下: 有 三个源文件,A.h.B.cpp.C.cpp. A.h是头文件,其中声明了三个变量a1.a2. a3. B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件.B.cpp和C.cpp中均包含头文件 A.h. 在编译时,编译能够通过,但链接时出了问题,出现"error   LNK1169:   找到一个或多个多重定义的符号"的错误. 经过分析,确定了这是由于两个实现文件中重复包含了头文件而造成的.可解决方法却始终找不到. 要 注意的是,在这里,在头文件中加入

出现“error LNK1169: 找到一个或多个多重定义的符号”的原因

或许,有人真的会这样写程序吧...所以才会碰到如下哥们提出的问题. https://zhidao.baidu.com/question/131426210.html 出现这种问题的原因链接中的最佳答案说得很清楚了,也确实是这样,所以在.h文件中最好不要涉及全局变量,这样容易在#include的时候出现重定义的问题,把全局变量的定义放到.cpp文件中,既增强代码的规范性,也不会引起不必要的错误,挺好~

vc 找到一个或多个多重定义的符号

vc 找到一个或多个多重定义的符号, 这个问题还是不能很好的解决. 最根本的是: 把所有有关定义的部分都放在.cpp文件中,对应的.h文件中只放声明.这样在#include ""的时候就可以完全避免出现符号重定义的现象. 万一真的碰到这种情况,可以试着用以下两种方法解决一下: 1.VS2005中,在项目->属性->链接器->命令行->附加选项中加 /force 可以解决问题,但会出现警告 2.在多重定义的符号前加static标识,可以很好的解决 申明全局变量,全

[debug] 解决在C++编写过程中的“找到一个或多个多重定义的符号”

如下图: 其在 common.h 中定义了一个变量a ,然后在两个 cpp 文件中都是用它. 在这种情况下,链接时就会出现 “找到一个或多个多重定义的符号”. 解决方案: 在某个cpp文件中定义,然后在 common.h 中是用 extern 在外部声明这个变量. 建立:变量的定义建立放在cpp中,在 头文件中加一个 extern 即可. 原文地址:https://www.cnblogs.com/onetrainee/p/11961511.html

关于"找到一个或多个多重定义的符号"问题的解决

在测试的时候突然心血来潮,把clearCMD.cpp的函数实现合并到clearCMD.h中,也就是说在函数声明的时候就写好函数实现,这样可以减少一个程序文件,修改完之后就一直报下面的错误: 即使使用了#ifndef-#define也没有用,因为它是为了防止嵌套调用的,而实际上TestRM_UnAutoTestSingleNode.cpp和TestRM_UnAutoTestMultiNode.cpp并没有嵌套调用,而是分别调用. 解决办法很简单,在clearCMD.h中,将成员变量前面加上exte

VC编译错误:一个或多个多重定义的符号

1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" ([email protected]@Z) 已经在 LIBCMT.lib(new.obj) 中定义1>uafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" ([email prote

fatal error LNK1169:找到一个或多个重定义的符号

这个算是个比较基础的问题,由于我不是C程序员,本行java,临时拉来做的,所以有些坑还得自己走出来. 这个问题是由于,全局变量在a.h中定义,在两个源文件a.cpp和b.cpp中引用,之后被编译器认为是重定义. 解决办法: 全局变量要在源文件中声明和定义.a.cpp. 至于a.cpp中引用的头文件,a.h,需要在定义时加extern. b.cpp引用a.h即可. extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义.另外,e

fatal error LNK1169: one or more multiply defined symbols found

终极解决方法:在Properties/Linker/General中将Force File Output改为Multiply Defined Symbol Only (/FORCE:MULTIPLE). 相关链接:http://blog.sina.com.cn/s/blog_7cb1cf700100vok3.html