错误:LNK2001:未解析的外部符号" private:static class

时间:2015-10-02 20:47:27

标签: c++ qt dll linker-errors

此论坛包含许多此类情况的示例,但在我的情况下,静态变量已正确定义,但我仍然会收到该错误。所以这个问题不重复上一个和上面的链接不回答问题。建议的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:未解析的外部符号   " private:静态类QStandardItemModel *   ValueSetsModelsContainer :: myDrugsModel"   (?myDrugsModel @ @@ ValueSetsModelsContainer @@ 0PAVQStandardItemModel A)
  •   
  • allergiesdialog.obj:-1:错误:LNK2001:未解析的外部符号" private:静态类QStandardItemModel *
      ValueSetsModelsContainer :: mySubstanceModel"
      (?mySubstanceModel @ @@ ValueSetsModelsContainer @@ 0PAVQStandardItemModel A)
  •   
  • allergiesdialog.obj:-1:错误:LNK2001:未解析的外部符号" private:静态类QStandardItemModel *
      ValueSetsModelsContainer :: myReactionsModel"
      (?myReactionsModel @ @@ ValueSetsModelsContainer @@ 0PAVQStandardItemModel A)
  •   

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

从DLL外部提供这些方法。

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