0

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

有 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

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

4

3 回答 3

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
}
于 2014-11-14T11:18:36.803 回答
0

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

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

#define MYMACRO __declspec(dllexport);

在你的课堂上

class classname
{
  public:
  MYMACRO void MYFUNCTION();
  MYMACRO void MYFUNCTION2();
};
于 2014-11-14T11:53:00.273 回答
0

您是否在只应该声明它的地方定义控制器模型? http://www.cprogramming.com/declare_vs_define.html

于 2014-11-14T11:15:11.337 回答