C++ error:LNK2005 已经在*.obj中定义

一般在编程有多个CPP及头文件时有可能出现以下错误:


error LNK2005: "void __cdecl test2(void)" (?test2@@YAXXZ) 已经在 源2.obj 中定义

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


问题在于没有把握清楚头文件的作用以及CPP之间函数与变量命名方式的规则:

头文件的内容:
★ 类型(struct-第7章)及类(class-第8章)的声明
★ 函数的声明
★ inline函数的定义与实现
★ 符号常量的定义及常变量的定义
★ 全局变量的extern声明
★ 其它需要的头文件

cpp之间的全局变量不能同名,所以不能在头文件中定义一个变量后在两个cpp中都包含头文件,否则会报上述错误。解决方法是加const 限定,另外不同cpp之间的函数必须要有区分(函数名,参数类型)否则也会报错。要调用cpp之间变量或函数必须加申明。


### 解决 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]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值