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 = lib
和 CONFIG += staticlib
。但这是另一个话题和另一个问题。
这个论坛包含很多这种情况的例子,但在我的例子中,静态变量定义正确,但我仍然得到那个错误。所以这个问题不是和前面的重复,上面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 = lib
和 CONFIG += staticlib
。但这是另一个话题和另一个问题。