Ошибка: 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. Но это уже другая тема и другой вопрос.