静态成员变量初始化在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里面完成,就不会有错。

时间: 2024-08-12 18:49:22

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

分析java类的静态成员变量初始化先于非静态成员变量

分析java类的静态成员变量初始化先于非静态成员变量 依上图中当class字节码文件被jvm虚拟机加载到内存中依次经过 连接 验证:对字节码进行验证 准备:给静态变量分配内存并赋予变量类型各自的默认值(注:基本类型为0或false,对象为null,static final修饰的常量直接赋予相应的值) 解析:类中符号引用转换成直接引用 初始化:为类的静态变量/静态语句块初始化相应的值 而类的初始化契机是:类在被第一次主动使用的情况下,主动使用包括以下6中情况: 使用new关键字实例化对象时. 调用

c++11之二: 非静态成员变量初始化

在C++11中,允许非静态成员变量的初始化有多种形式:初始化列表; 使用等号=或花括号{}进行就地的初始化. 可以为同一成员变量既声明就地的列表初始化,又在初始化列表中进行初始化,只不过初始化列表总是看起来“后作用于”非静态成员. 也就是说,初始化列表的效果总是优先于就地初始化的. #include <iostream> 2 using namespace std; 3 class CBase{ 4 public: 5 CBase(){cout<<"mem default

词云:解决pip install wordcloud安装过程中报错“error: command &#39;x86_64-linux-gnu-gcc&#39; failed with exit status 1”问题

外部环境:ubuntu16.04, 64bits, 全局环境python2.7 在虚拟环境(python3.5)中执行 pip install wordcloud 时安装失败,报错: error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 ---------------------------------------- Failed building wheel for wordcloud Running setup.py

Java构造方法、成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的?

[Java笔试真题]:构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [解答]:当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构造方法. Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减): ① 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次: ② 父类优先于子类进行初始化: ③ 按照成员变量定义顺序进行初始化,即使变量定义散布于方法

VS报错 error LNK2005: [email&#160;protected] 已经在 MSVCRTD.lib(dllmain.obj) 中定义

链接报错: 错误 33 error LNK2005: [email protected] 已经在 MSVCRTD.lib(dllmain.obj) 中定义 E:\客户问题\w_王鹏\EventLibTest_TibrvAlternative_MultiEnv-4-0.3将 DTSSysEvent.xml做为单独参数传给每个环境\EventLibTest_TibrvAlternative_MultiEnv\Win32 \APPFL\EventLibMultiEnvDLL\mfcs100d.lib(

【error LNK2005: "struct HWND__ * ui_hwnd" ([email&#160;protected]@[email&#160;protected]@A) 已经在 Susake.obj 中定义】

产生原因:多文件包含时,全局变量未用extern 解决方法:直接在全局变量前加上extern即可,若要在在其他文件中使用,该变量声明下就ok了~~ 另外引出一个话题,你是不是也发现了这么一个现象?? 比如 A.h A.cpp #include "A.h" #include "B.h" HWND ui_hwnd, hwnd; int main(int argc, char *argv[]) { ui_hwnd = hwnd; return 0; } B.h B.cpp

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

[问题] >> : error LNK2005: ×××× (★★★★) 已经在 ※※※.obj 中定义 fatal error LNK1169: 找到一个或多个多重定义的符号 [可能的原因] 当第一个使用该头文件的.cpp文件生成.obj的时,int i 已经定义.当另外一个使用这个头文件的.cpp再次[单独]生成.obj的时候,int i 又被定义.然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义. [解决] 通常是由于在.h文件里定义了此变量,移动

select sequence.currval 时报错 ORA-08002: 序列XXXX尚未在此进程中定义

情景描述: 1.我们创建一个表,表名为S_DEPART -- Create table create table S_DEPART ( departid INTEGER not null, departname NVARCHAR2(40) not null, departorder INTEGER default 0 ) 2.创建一个sequence序列,名称为S_DEPART_S CREATE SEQUENCE S_DEPART_S MINVALUE 1 MAXVALUE 9999999999

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

为什么会出现这个错误??"error LNK2005: 已经在*.obj中定义"  编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难解决的错误,弄清楚它形成的原因,就可以轻松解决它了. 造成LNK2005错误主要有以下几种情况:   1.重复定义全局变量.可能存在两种情况:   A.对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下.其实这是错误的,全局变量是针对整个工程的. 正确的应该是在一个CPP文件中定义如下