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

Posted 凯撒大猩猩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态成员变量初始化在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里面完成,就不会有错。

 

以上是关于静态成员变量初始化在vs中报错“error LNK2005 static VimbaSystem...已经在...obj中定义”的主要内容,如果未能解决你的问题,请参考以下文章

C++静态成员变量必须在类的定义之外进行声明 (error LNK2001: unresolved external symbol)

C++静态成员变量必须在类的定义之外进行声明 (error LNK2001: unresolved external symbol)

GameEngine.obj : error LNK2001: 无法解析的外部符号 private: static class GameEngine * GameEngine::

VS2017项目升级 error LNK2005: "public: __thiscall ATL::CTime::

error LNK2001: 无法解析的外部符号

error LNK2019: 无法解析的外部符号 求解答..