【问题标题】:Error: LNK2001: unresolved external symbol "private: static class错误:LNK2001:未解析的外部符号“私有:静态类
【发布时间】:2015-12-31 03:54:04
【问题描述】:

这个论坛包含很多这种情况的例子,但在我的例子中,静态变量是正确定义的,但是我仍然得到那个错误。所以这个问题不重复之前和上面的链接没有回答这个问题。建议的21 answers post 没有西蒙在这里给我的解决方案,请取消标记为“重复”。

看来我已经全部正确地声明了,检查一下:

.h 文件:

class ValueSetsModelsContainer : public QObject
{
  Q_OBJECT

public:
  static void DLLEXPORT loadAllergiesValueSets(MPTDatabase *db);
  static void DLLEXPORT loadProceduresValueSets(MPTDatabase *db);

  // Models access functions
  static QStandardItemModel *drugsModel();
  static QStandardItemModel *substanceModel();
  static QStandardItemModel *reactionsModel();

private:
  static QStandardItemModel *myDrugsModel, *mySubstanceModel, *myReactionsModel;
};

.cpp:

QStandardItemModel *ValueSetsModelsContainer::myDrugsModel = 0;
QStandardItemModel *ValueSetsModelsContainer::mySubstanceModel = 0;
QStandardItemModel *ValueSetsModelsContainer::myReactionsModel = 0;

QStandardItemModel *ValueSetsModelsContainer::drugsModel()
{
  return ValueSetsModelsContainer::myDrugsModel;
}

QStandardItemModel *ValueSetsModelsContainer::substanceModel()
{
  return ValueSetsModelsContainer::mySubstanceModel;
}

QStandardItemModel *ValueSetsModelsContainer::reactionsModel()
{
  return ValueSetsModelsContainer::myReactionsModel;
}

所以静态变量是在 cpp 中定义的,但是我仍然在另一个调用 ValueSetsModelsContainer 方法的模块中遇到链接错误:

  • allergiesdialog.obj:-1:错误:LNK2001:未解析的外部符号 “私有:静态类 QStandardItemModel * ValueSetsModelsContainer::myDrugsModel" (?myDrugsModel@ValueSetsModelsContainer@@0PAVQStandardItemModel@@A)
  • allergiesdialog.obj:-1:错误:LNK2001:无法解析的外部符号“私有:静态类 QStandardItemModel *
    ValueSetsModelsContainer::mySubstanceModel"
    (?mySubstanceModel@ValueSetsModelsContainer@@0PAVQStandardItemModel@@A)
  • allergiesdialog.obj:-1:错误:LNK2001:无法解析的外部符号“私有:静态类 QStandardItemModel *
    ValueSetsModelsContainer::myReactionsModel"
    (?myReactionsModel@ValueSetsModelsContainer@@0PAVQStandardItemModel@@A)

问题可能出在哪里?

【问题讨论】:

  • 不是重复的,上面的链接没有回答我的问题。
  • 您是否将所有对象(已编译的 cpp 文件)直接链接到最终二进制文件中?或者你有一些图书馆参与?您能否添加您的 .pro 文件以使项目结构清晰?
  • 似乎是的 - 直接。 PRO 和包含的 PRI 非常大 - 此处包含许多 cpp 和 h 文件。
  • 在你的 .h 文件中试试这个static DLLEXPORT QStandardItemModel *drugsModel();
  • 投票重新打开,以便评论可以转换为答案。这对我来说不像是一个骗局。

标签: c++ qt dll linker-errors


【解决方案1】:

从您的链接命令可以看出,您正在将对象链接到一个 DLL 中,然后在第二步中将 DLL 与您的最终二进制文件链接。这可能是由您的项目设置中的subdirs template 引起的。

当你想从外部获得一个 DLL 的方法时,你需要通过__declspec( dllexport ) 使它可用。我猜这是在您的自定义预编译器常量 DLLEXPORT 中完成的。

现在在你的 .h 文件中试试这个:

static DLLEXPORT QStandardItemModel *drugsModel();
static DLLEXPORT QStandardItemModel *substanceModel();
static DLLEXPORT QStandardItemModel *reactionsModel();

使这些方法可从 DLL 外部使用。


顺便说一句:如果您只是从自己的项目中链接东西并且不需要将其提供给其他人,我认为在这里拥有一个中间动态库 (DLL) 是没有意义的。考虑改用静态库,方法是在 ValueSetsModelsContainer 所在的 .pro 文件中设置 TEMPLATE = libCONFIG += staticlib。但这是另一个主题和另一个问题。

【讨论】:

  • 感谢您的全面回答。
猜你喜欢
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2012-05-03
  • 2014-09-27
相关资源
最近更新 更多