-
cpp到obj再到exe,重定义的问题
2017-03-29 10:15:50include的目的是我们可能会在当前的cpp中使用其他cpp内定义的东西,但是我们不可以直接include该cpp,因为这会导致在链接的时候出现重定义的错误(cpp本身有一份定义,又被别人include了一份定义,链接的时候就...上述过程分为两步:
(1)每个cpp先生成各自对应的obj即编译单元;
(2)最后通过链接器把所有obj链接成一个exe形成一个程序。
而重定义在这两步之中都可能发生。
第一步中,如果一个cpp内不小心定义了多份(>=2)相同数据,在生成obj,还没链接前就已经报错了。
第二步也是最常出现重定义的地方。你可能不小心地在两个cpp中定义了相同的数据,各自生成obj的时候并不会报错,但是当链接的时候就会出现重定义。或者你的项目的多份cpp都include了同一份.h文件,而这个.h文件存在定义,一样的,在各自生成obj的时候不会报错(如果没有其他的重定义的话),但是当链接的时候就会报错。 -
error LNK2005 已经在 obj 中定义 错误
2015-03-11 12:53:33>> : error LNK2005: ×××× (★★★★) 已经在 ※※※.obj 中定义 通常是由于在.h文件里定义了此变量,移动到.cpp文件里即可。 并在使用到这个变量的cpp文件中加上extern int ID; ...>> : error LNK2005: ×××× (★★★★) 已经在 ※※※.obj 中定义
通常是由于在.h文件里定义了此变量,移动到.cpp文件里即可。
并在使用到这个变量的cpp文件中加上extern int ID;出错原因:
无意中遇到了这样的编译问题, 于是google,发现在.h文件里定义变量,发生这问题的概率是灰常大的.
下面这段红字是参考网上的说法:
当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.
不过经过一轮研究发现.. 其实这说法不怎么正确.. 最起码对VS来说..
经过实验, 发现只要有两个cpp同时包含一个定义了变量的.h文件,就会提示错误.
再回想下刚 考完的编译原理, obj是什么? 其实就是cpp翻译后的一坨中间代码.. 一般编译过程就是把cpp先翻译成obj, 最后把obj再连接成exe. 这样,不管中间有没有第三者把前两个连接一起, 最终obj还是会汇集在一起.. 下面可以看到,错误发生在链接,而不是翻译..
正在链接...
1>3.obj : error LNK2005: "int i" () 已经在 2.obj 中定义
1>D:\编程之美\vs2008代码\dfsdfadsfec\Debug\dfsdfadsfec.exe : fatal error LNK1169: 找到一个或多个多重定义的符号本人得出的结论:
只要两个或者以上的.cpp同时包含了一个定义了变量的.h文件,就会提示错误.
不过注意, 这中间可能会包含些比较复杂的逻辑关系..
例如我的那坨代码..
假定一个定义了变量的1.h文件
有1.cpp和2.cpp, 1.cpp包含1.h, 2.cpp只包含2.h 但是2.h包含了1.h.. 所以1.h中定义的变量编译的时候会在2.pp中有定义. 于是乎2.cpp翻译成的obj里也会有定义, 结果导致提示obj里重定义.
在头文件和cpp文件错中复杂的情况下, 根本就很难判断其祸根源.
所以得出结论:
没事就别在.h中定义变量,或者初始化静态成员变量(我就是后一种情况).
不过有种比较酷的做法, 就是直接改成.c编译. 据说c里遇到重定义, 会忽略为声明.
-
error LINK2005: XXXX已经在 .obj 中定义
2019-08-13 21:46:50然后A.cpp包含了该.h,B.cpp包含了该.h,于是在链接的时候,生成A.obj,B.obj,但是 .h中定义的变量会在这两个obj中又被定义,所以,导致了这个LINK2005错误。 解决方法:不要在.h中定义变量!!在.h中只声明函数,...当项目代码比较多,文件也比较多的时候,这个问题真的非常棘手,可能会耗费大量的时间来排查错误。
问题出现的原因:在.h文件中定义了变量。然后A.cpp包含了该.h,B.cpp包含了该.h,于是在链接的时候,生成A.obj,B.obj,但是 .h中定义的变量会在这两个obj中又被定义,所以,导致了这个LINK2005错误。 解决方法:不要在.h中定义变量!!在.h中只声明函数,类。把具体的实现都必须要放到.cpp中!!!!
-
error:LNK2005 已经在*.obj中定义
2016-01-15 14:23:20实习项目中涉及到静态库的编写,在用实例调试静态库的时候,遇到LNK2005重复定义错误:已经在“*.obj”中定义。 上网搜了一下,总结有如下几种情况: 1、重复定义全局变量 全局变量是针对整个工程的,在一个CPP...实习项目中涉及到静态库的编写,在用实例调试静态库的时候,遇到LNK2005重复定义错误:已经在“*.obj”中定义。
上网搜了一下,总结有如下几种情况:
1、重复定义全局变量
全局变量是针对整个工程的,在一个CPP文件的定义:int nCount;那么在使用的CPP文件中就应该使用extern int nCount即可,如果还是使用int nCount 就会产生LNK2005错误;
根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义:
1)使用extern 关键字 2)不能给变量赋初值
2、头文件的重复包含
包含的头文件中含有变量、函数、类的定义,在其他使用的地方多次包含,造成重复包含,产生LNK2005错误,
有两种解决方法:
1)使用宏 在头文件head.h中加入
#ifndef HEAD_H_
#define HEAD_H_
......
#endif
2)使用预编译,文件开头加入
#pragma once
3、使用第三方库造成
主要情形是C运行期函数库和MFC的库冲突造成的。具体的方法就是将提示出错的库放到另一个库的前面。
举例:
#include <WinSock2.h> //WinSock2.h头文件必须在Windows.h之前 #include <Windows.h>
-
错误 2 error LNK2005: *已经在 *.obj 中定义(使用多个.cpp文件时,应注意的事项)
2017-04-14 17:07:32注意,.h文件应最好只包含声明而无定义,因为.h文件可能会被.cpp文件引用多次,这样会产生“重定义”的错误,同时可以使含main函数的.cpp文件更加简洁。 如图: | | | | | | | | 其他... -
(vs2008链接错误LK200x:xxx在yyy.obj中已定义或xxx在yyy中以被引用):一个全局的变量想在多个cpp文件中...
2013-09-08 01:55:04近来写工程:想把一个变量在多个cpp文件中使用,写了类似如下代码: main.cpp: #include "A.h" #include "B.h" extern w;//对w的extern声明 main() { do(w);//对W进行操作 } A.h: w;//w的声明 B.h #include... -
【C++】error:LNK2005 已经在*.obj中定义
2020-04-27 12:39:56把在.h中定义的全局变量移到.cpp中 -
C++ error:LNK2005 已经在*.obj中定义
2016-06-07 23:01:36test2@@YAXXZ) 已经在 源2.obj 中定义 fatal error LNK1169: 找到一个或多个多重定义的符号 问题在于没有把握清楚头文件的作用以及CPP之间函数与变量命名方式的规则: 头文件的内容: ★ 类型 -
c++调试记录:error LINK2005: XXXX已经在 .obj 中定义
2017-08-01 14:20:47然后A.cpp包含了该.h,B.cpp包含了该.h,于是在链接的时候,生成A.obj,B.obj,但是 .h中定义的变量会在这两个obj中又被定义,所以,导致了这个LINK2005错误。 解决方法:不要在.h中定义变量!!在.h中只声明函数... -
error:LNK2005 _main 已经在 *.obj 中定义
2017-06-13 00:03:38正确的应该是在一个CPP文件中定义如下:int g;那么在使用的CPP文件中就应该使用:extern int g (1)声明必须使用extern关键字; (2)不能给变量赋初值 2.头文件的包含重复。此时应该在头文件中设置 相关的宏 -
error:LNK2005 已经在*.obj文件中定义
2018-09-16 10:14:50造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量。可能存在两种情况: ... 正确的应该是在一个CPP文件中定义如下: int g_Test; 那么在使用的CPP文件中就应该使用: extern int g_Tes... -
VS报错 C2005:某函数已在某.obj文件中定义
2018-09-11 14:50:19本人遇到的情况: 1、该函数定义在了头文件中:把该函数的声明和定义分开,声明在头文件中,定义在.cpp文件中。 未完待续。。。 -
错误 LNK2005 xxx已经在 xxx.obj 中定义
2020-06-03 21:49:38写了一个main.cpp 一个Singleton.h和一个Singleton.cpp Singleton.h #pragma once class Singleton { public: static Singleton* GetInstance() { if (m_Instance == nullptr) m_Instance = new Singleton();... -
OPNET 仿真中遇到错误:error LNK2005:已经在*.obj中定义”
2018-05-17 21:14:22遇到这种问题一般是因为全局变量定义的时候只在头文件里进行声明,而没有再CPP文件中定义。详细见网址:https://www.cnblogs.com/MuyouSome/p/3332699.html -
C++LNK2005 某函数已经在.obj中定义
2018-05-10 12:27:20原因:调用函数时错将.cpp文件包含解决办法,将#include “xxx.cpp”改为#include“xxx.h” -
错误 LNK2005 "public: __thiscall已经在 main.obj 中定义
2017-09-14 14:20:20错误 LNK2005 “public: __thiscall已经在 main.obj 中定义 解决办法:这个问题就是vs自动生成的构造函数和析构函数没有删除移动到cpp文件中而该hpp文件又被引用了 构造函数从.h文件修改到.cpp文件下可以解决。 -
关于VS "error LNK2005: 已经在 .obj 中定义
2014-03-09 21:34:51无意中遇到了这样的编译问题, 于是google,发现在.h文件里定义变量,发生这问题的概率是灰常大的. 下面这段红字是参考网上的说法: 当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在... -
编译.cpp文件为.obj文件成功后,要将所有的obj文件连接成为.exe文件
2018-12-26 15:45:47某个函数,在不同的cpp文件中有重复的定义,即有2个函数体的实现; 2.调用某个函数时,无法确定调用哪个,即函数参数类型或个数无法匹配; 3.动态性声明错误如果在类定义(.H文件)中声明了使用动态性,则在类实现部分... -
关于VS2008编译错误"error LNK2005: 已经在 .obj 中定义
2012-09-08 14:37:33关于VS2008编译错误"error LNK2005: 已经在 .obj 中定义" 无意中遇到了这样的编译问题, 于是google,发现在.h文件里定义变量,发生这问题的概率是灰常大的. 下面这段红字是参考网上的说法: 当... -
vs2019 LNK2005 _main已经在HelloCApp.obj中定义
2019-09-21 10:19:40建好的项目下有一个 HelloCApp.cpp ,里面有个 main 方法。 这时又在源文件下新建 main.c ,写了输出 Hello World ctrl+f5 时报错,搜了下看到这个 链接器工具错误LNK2005 在里面受到启发, ... -
VS 编译出现 LNK2005 XXX 已经在 XXX.obj 中定义
2015-12-23 20:15:30多重包含含有变量定义的.h文件所造成 这个现象很容易重新,首先新建一个1.h文件,然后在里面写下如下代码 #pragma once int i = 0; 然后新建一个1.cpp,里面代码如下: #include "1.h" 再新建一个2.cpp,代码... -
错误 1 error LNK2005: _DllMain@12 已经在 dllmain.obj 中定义
2013-07-08 17:17:20_DllMain 这个已经在解决方案中的dllmain.cpp中已经定义过,删除即可 -
_stbi_failure_reason 已经在 main.obj 中定义
2019-09-20 12:25:30That’s because STB_IMAGE_IMPLEMENTATION needs to be defined within a .c or .cpp file, not within a header. When you define STB_IMAGE_IMPLEMENTATION, you are creating the bulk of t... -
error:LNK2005全局函数在.OBJ中重定义的解决办法
2019-05-17 22:03:21很多人应该都遇到过如题所示的重定义问题,原因就是由于头文件的重复包含...但是这两种方式对于在头文件中定义全局函数的方法无解。 正确的解决方法:将全局函数的声明放在头文件,而定义放在cpp之中。 ... -
头文件里面实现一个函数,在两个cpp中包含,则重复定义,如果加上inline则不会报错
2016-06-14 22:38:54为什么类的定义应当写在头文件中,从而被多个源文件包含?比如myclass.h定义了一个类myclass(只定义类,不定义成员函数), file1.cpp里#include "myclass.h",编译得到file1.obj; file2.cpp里也#include "myclass.... -
C++中定义静态成员变量时,总是提示已经在main.obj中定义,并找到一个或多个重定义的符号
2020-11-27 14:53:471、C++中正常对静态成员变量必须在类外进行初始化,但是不能为了方便,然后就这样初始化: 自己给自己就挖了坑,必须放在cpp文件中进行初始化工作: 这样你才避开了上面的坑,好的 ... -
error LNK2005:xxx已在xxx.obj中定义fatal error LNK1169: 找到一个或多个多重定义的符号
2013-06-24 10:40:37工程中有一个can.cpp文件内定义了很多变量和函数,就想把这部分定义搬出来新建一...error LNK2005:xxx已在can.obj中定义fatal error LNK1169: 找到一个或多个多重定义的符号。在工程文件夹的debug目录下发现vars.cpp生
-
itextsharp.dll
-
华为1+X——网络系统建设与运维(高级)
-
中央广播电视大学《知识产权法》期末总复习资料(含答案).pdf
-
rust 实现选择排序
-
LruCache的原理与实现
-
MySQL 管理利器 mysql-utilities
-
使用 Linux 平台充当 Router 路由器
-
FTP 文件传输服务
-
自动化测试Python3+Selenium3+Unittest
-
在线考试,物业管理系统
-
公司核心业务数据——ONTAP 平台虚拟化集群存储介绍
-
心怀梦想脚踏实地幼儿园上学期开学工作会议ppt.ppt
-
古代汉语期末考试试题及答案.doc
-
华为机试 参数解析
-
现代汉语试卷.doc
-
多路复用三种模型——select、poll、epoll
-
PPT大神之路高清教程
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
【布道者】Linux极速入门
-
中央广播电视大学《幼儿园课程与活动设计》期末总复习资料(含答案).pdf