Error: LNK2001: unresolved external symbol "private: static class

Error: LNK2001: unresolved external symbol "private: static class

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

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

.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 方法的模块中仍然 linking 错误:

  • allergiesdialog.obj:-1: error: LNK2001: unresolved external symbol "private: static class QStandardItemModel * ValueSetsModelsContainer::myDrugsModel" (?myDrugsModel@ValueSetsModelsContainer@@0PAVQStandardItemModel@@A)
  • allergiesdialog.obj:-1: error: LNK2001: unresolved external symbol "private: static class QStandardItemModel *
    ValueSetsModelsContainer::mySubstanceModel"
    (?mySubstanceModel@ValueSetsModelsContainer@@0PAVQStandardItemModel@@A)
  • allergiesdialog.obj:-1: error: LNK2001: unresolved external symbol "private: static class QStandardItemModel *
    ValueSetsModelsContainer::myReactionsModel"
    (?myReactionsModel@ValueSetsModelsContainer@@0PAVQStandardItemModel@@A)

问题可能出在哪里?

根据您的 link 命令,您发现您正在 link 将对象组合成一个 DLL,然后在第二步中 link 该 DLL 与您的最终二进制文件。这可能是由项目设置中的 subdirs template 引起的。

只要你想从外部使用 DLL 的方法,就需要通过 __declspec( dllexport ) 使其可用。我想这是在您的自定义预编译器常量 DLLEXPORT.

中完成的

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

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

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


顺便说一句:我认为如果您只是 link 从您自己的项目中获取东西并且不需要制作它,那么在这里拥有一个中间动态库 (DLL) 是没有意义的可供他人使用。考虑使用静态库,而不是通过在 ValueSetsModelsContainer 所在的 .pro 文件中设置 TEMPLATE = libCONFIG += staticlib。但这是另一个话题和另一个问题。