此论坛包含许多此类情况的示例,但在我的情况下,静态变量已正确定义,但我仍然会收到该错误。所以这个问题不重复上一个和上面的链接不回答问题。建议的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)
问题出在哪里?
答案 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。但这是另一个主题和另一个问题。