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:   找到一个或多个多重定义的符号“的错误。

经过分析,确定了这是由于两个实现文件中重复包含了头文件而造成的。可解决方法却始终找不到。

要 注意的是,在这里,在头文件中加入#ifndef……#endif这样的预编译命令是没用的,因为这是防止嵌套包含头文件的,而本例中并没有嵌套包含,是 在两个文件中分别包含。

因为这三个变量在两个实现文件中都要用到,所以一定要包含在A.h中。后来在网上找到了解决方法,其实很简单。

就是在A.h中的三个变量声明前加上extern 关键字,然后在B.cpp中不加extern关键字再次声明这三个变量。于是编译链接顺利通过。

其实这是C++中比较基础的问题。
还有种情况是定义了函数,但在另个文件中准备用#include打开,但是结果还是会出现。

直接包含不就在两个cpp文件中都定义了相同的函数/变量吗,链接时会出现重复定义(你自己试试),所以需要使用extren申明一下即可,他们使用的是同一个实体。

例如:
1、你在a.cpp中定义了一个函数
void func()
{
}

希望在b.cpp中调用,调用前就需要进行声明,格式如下:
extren void func(); //extren 后面根的形式和函数定义形式要完全相同

void mian()
{
    func();
}

2、1、你在a.cpp中定义了一个变量  int a;

希望在b.cpp中使用,使用前就需要进行声明,格式如下:
extren int a; //extren 后面根的形式和变量定义形式要完全相同

void main()
{
    int b = a;
}

时间: 2024-10-10 01:24:04

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

全局变量重复定义,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

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: 找到一个或多个多重定义的符号”的原因

或许,有人真的会这样写程序吧...所以才会碰到如下哥们提出的问题. 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

win7 、2008 提示Error 1606 Could Not Access Network Location %SystemDrive%/inetpub/wwwroot/ 的错误解决方法

在安装控件过程中出现提示Error 1606 Could Not Access Network Location %SystemDrive%/inetpub/wwwroot/ 的错误解决方法 1. 点击开始菜单    –运行  –regedit   后按回车键 2,找到注册表   HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/InetStp/PathWWWRoot  (32位系统) 或者  HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Nod