【问题标题】:C++ header cannot be included without LNK2005 error如果没有 LNK2005 错误,则不能包含 C++ 标头
【发布时间】:2014-11-14 10:33:46
【问题描述】:

我有一个大型项目,旨在控制和测试硬件。

有 4 个设备控制类(干涉仪、压电电机、PXI 系统和纳米定位控制器)。

我创建了一个名为 MainIO 的“主”类,它存储上述每个类的实例,以便在 IO 范围内执行操作(即移动电机和检查干涉仪)。 MainIO 头文件包括 4 个控制类头文件。

然后我有一个单独的“全局”hpp/cpp,其中包含全局变量、转换、ini 文件操作等。这是用操作类型的命名空间而不是创建一个类来布置的,即GCONV::someFunction();GMAIN::controllerModel;

我需要所有 4 个控件类才能访问转换和其他全局操作。我曾经让它们都包括 global.hpp,但我已经改变了一些东西(我想不出它可能是什么!)现在看来我不能在我的任何控制类 hpp 或 cpp 中包含 global.hpp没有出现链接器错误 -

global.obj:-1: error: LNK2005: "class QString GMAIN::controllerModel" (?controllerModel@GMAIN@@3VQString@@A) already defined in controllers.obj

我绝对确定我做了一些愚蠢的事情,解决方案正盯着我的脸,但它已经到了我对它感到非常沮丧的阶段,以至于我看不到树木的树木。

【问题讨论】:

    标签: c++ header linker include lnk2005


    【解决方案1】:

    我发现我做错了什么,虽然它很简单,但我花了一段时间才找到相关文档来发现我的错误,所以我会回答我自己的问题,希望能给别人一个时间更轻松。

    事实证明,在 global.hpp 中,我在这样的命名空间中声明变量:

    namespace GMAIN {
        QString controllerModel;
    }
    

    本质上,这意味着每个包含 global.hpp 的文件都将包含其自己的 QString controllerModel 定义,从而引发链接器错误。每个控件类都会对同一个命名变量有自己的定义,这违反了单一定义规则。

    要解决这个问题,QString controllerModel 需要被外部化。 extern 关键字允许在多个位置声明一个变量,同时只有一个定义(因此不会违反规则)。

    所以现在的工作代码是:

    //in global.hpp
    namespace GMAIN {
        extern QString controllerModel; //declaration - this is called for each `#include global.hpp`
    }
    
    //in global.cpp
    namespace GMAIN {
        QString controllerModel; //definition - only called once as .cpp is never included
    }
    

    【讨论】:

      【解决方案2】:

      您是在只应该声明它的地方定义 controllerModel 吗? http://www.cprogramming.com/declare_vs_define.html

      【讨论】:

      • 谢谢,我在您发表评论之前就发现了我的错误,但这正是问题所在
      【解决方案3】:

      您应该导出您的 dll。 使用__declspec(dllexport)。您可以在头文件中包含__declspec(dllexport) 作为宏,并将宏放在每个成员函数的开头。

      例如: 在您的Header.h 文件中包含

      #define MYMACRO __declspec(dllexport);
      

      在你的班级里

      class classname
      {
        public:
        MYMACRO void MYFUNCTION();
        MYMACRO void MYFUNCTION2();
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-29
        相关资源
        最近更新 更多