error LNK2005 已经在 obj 中定义 错误

本文详细解析了在C++项目中遇到的LNK2005错误,介绍了错误产生的原因及其解决方法,强调避免在头文件(.h)中定义变量的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

>> : 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里遇到重定义,  会忽略为声明.

### 解决 Visual Studio 错误 LNK2005 错误 `LNK2005` 表明链接器检测到多个相同符号的定义。具体来说,在 `.obj` 文件中发现了重复的 `_main` 函数定义[^1]。 当遇到此类问题时,通常是因为存在两个或更多源文件都包含了相同的全局函数或变量声明。这可能是由于头文件管理不当或者库文件被多次引入造成的。对于当前情况中的反序函数(假设为 `reverse`),如果该函数在不同对象文件(如 OpenCVFi.obj 和 HalconFi.obj)中有实现,则会触发此错误。 为了修复这个问题: - **检查命名冲突**:确认是否有其他地方也实现了名为 `reverse` 的函数,并且这些实现在不同的编译单元里。如果有,请重命名其中一个版本以避免名称冲突。 - **静态作用域调整**:考虑将局部使用的辅助功能标记为 static 类型,这样它们就只会在单个翻译单位内部可见,从而防止外部访问引发多重定义的问题。例如: ```cpp static cv::Point_<double> reverse(const cv::Point_<double>& point); ``` - **预处理器指令控制**:利用宏来确保某些代码片段仅在一个位置生效。比如可以采用如下方式包裹可能引起冲突的部分: ```cpp #ifndef REVERSE_FUNCTION_DEFINED #define REVERSE_FUNCTION_DEFINED // Function definition here... #endif /* !REVERSE_FUNCTION_DEFINED */ ``` 另外值得注意的是,有时第三方库之间也可能发生类似的冲突。在这种情况下,应该仔细审查项目设置以及所涉及的所有库之间的关系,必要时移除不必要的依赖项[^2]。 最后,考虑到特定环境下的配置差异,建议查看项目的属性页,特别是 C/C++ -> 常规 -> 额外包含目录和链接器 -> 输入 -> 额外依赖项这两处设定,排除任何可能导致重复定义的因素[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值