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