静态成员变量初始化在vs中报错“error LNK2005 static VimbaSystem...已经在...obj中定义”...

今天在做AVT相机驱动的时候,编译后出现这个问题,我在一个类中定义了一个静态成员变量,但是编译总是报错:“error LNK2005 static VimbaSystem...已经在...obj中定义”。

代码大致如下:

cameraBase.h

 1 #pragma once
 2 class cameraBase
 3 {
 4 public:
 5     static void instance();
 6     virtual void open()=0;
 7 
 8 protected:
 9     static VimbaSystem &system;
10 }
11 VimbaSystem &cameraBase::system = VimbaSystem::GetInstance(); //静态成员变量必须在类外初始化,否则就会报错
12 13 class cameraAvt : public cameraBase 14 { 15 public: 16 void open();
17
}

 

cameraBase.cpp

1 #include "cameraBase.h"
2 void cameraBase::instance()
3 {
4     system.Startup();  
5 }

 

cameraAvt.cpp

1 #include "cameraBase.h"
2 void cameraAvt::open()
3 {
4     system.OpenCameraByID(NULL,VmbAccessModeFull,camera);  
5 }

 

当我在cameraBase.h头文件里初始化静态成员变量时,报错:

ERROR:error LNK2005 static VimbaSystem...已经在...obj中定义

 

经过网上查找资料,找到了答案,参照网上的说法:

当你第一个使用了这个头的cpp文件生成obj的时候,system就在里面定义了,当另外一个使用这个头的cpp再次[单独]生成obj的时候,system又被定义了,然后两个obj被另外一个也包含这个头的cpp连接在一起,就会出现重复定义。

只要两个cpp文件同时包含一个定义了变量的h文件,就会报错。

 

因此只要把system的初始化放到cameraBase.cpp文件里完成,就能编译成功,即cameraBase.cpp:

1 #include "cameraBase.h"
2 VimbaSystem &cameraBase::system = VimbaSystem::GetInstance();
3 void cameraBase::instance()
4 {
5     system.Startup();  
6 }

 

只要记住,不要在h文件里初始化静态成员变量,放到cpp里面完成,就不会有错。

 

转载于:https://www.cnblogs.com/Jace-Lee/p/5856829.html

### 解决 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、付费专栏及课程。

余额充值