zoukankan      html  css  js  c++  java
  • 静态成员变量初始化在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里面完成,就不会有错。

  • 相关阅读:
    计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组
    计蒜客模拟赛D2T1 蒜头君的兔子:矩阵快速幂
    计蒜客模拟赛D1T2 蒜头君的树:树上节点之间最短距离和
    计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和
    Cubieboard安装系统
    awk速查手册
    sed速查手册
    常用正则表达
    MySQL索引小记
    jQuery中attr和prop的区别
  • 原文地址:https://www.cnblogs.com/Jace-Lee/p/5856829.html
Copyright © 2011-2022 走看看