Ошибка: LNK2001: неразрешенный внешний символ "private: статический класс
Этот форум содержит много примеров такой ситуации, но в моем случае статические переменные определены правильно, однако я все равно получаю эту ошибку. Таким образом, эта проблема не дублирует предыдущую и выше ссылку не отвечает на вопрос. Предлагаемый 21 ответ на сообщение не имеет решения, которое дал мне Симон, пожалуйста, отметьте это как "дубликат".
Кажется, я все правильно заявил, проверьте это:
.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: static class QStandardItemModel *
ValueSetsModelsContainer:: mySubstanceModel"
(? MySubstanceModel @ValueSetsModelsContainer @@0PAVQStandardItemModel @@A) - allergiesdialog.obj: -1: ошибка: LNK2001: неразрешенный внешний символ "private: static class QStandardItemModel *
ValueSetsModelsContainer:: myReactionsModel"
(? MyReactionsModel @ValueSetsModelsContainer @@0PAVQStandardItemModel @@A)
Где проблема может быть?
Ответы
Ответ 1
Из ваших команд связывания оказалось, что вы связываете вместе объекты в DLL, а затем на втором шаге связываете DLL с вашим окончательным двоичным файлом. Это может быть вызвано шаблоном subdirs в настройках вашего проекта.
Всякий раз, когда вы хотите, чтобы метод 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. Но это уже другая тема и другой вопрос.