ValueSetsModelsContainer

ValueSetsModelsContainer

该论坛包含许多这种情况的示例,但是在我的情况下,正确定义了静态变量,但是仍然出现该错误。因此,此问题不是先前链接的重复,也无法回答该问题。建议的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)
  


问题可能出在哪里?

最佳答案

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

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

现在,在您的.h文件中尝试以下操作:

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


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



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

10-08 13:39