静态成员变量初始化在vs中报错“error LNK2005 s…
2018-06-17 23:48:37来源:未知 阅读 ()
今天在做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里面完成,就不会有错。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ const成员函数 2020-06-03
- C++ 单定义规则 2020-05-10
- C++ 静态持续变量 2020-05-10
- C++ 自动变量 2020-05-10
- 成员指针与mem_fn 2020-04-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash