簡體   English   中英

錯誤:LNK2001:未解析的外部符號“專用:靜態類

[英]Error: LNK2001: unresolved external symbol "private: static class

該論壇包含許多這種情況的示例,但是在我的情況下,正確定義了靜態變量,但是仍然出現該錯誤。 因此,此問題不是先前鏈接的重復,也無法回答該問題。 建議的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:未解決的外部符號“私人:靜態類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模板引起的。

每當您想從外部使用DLL方法時,都需要通過__declspec(dllexport)使它可用。 我想這是在您的自定義預編譯器常量DLLEXPORT

現在,在您的.h文件中嘗試以下操作:

static DLLEXPORT QStandardItemModel *drugsModel();
static DLLEXPORT QStandardItemModel *substanceModel();
static DLLEXPORT QStandardItemModel *reactionsModel();

使這些方法可從DLL外部使用。


順便說一句:如果您只是鏈接自己項目中的內容並且不需要將其提供給他人,那么我認為這里沒有中間動態庫(DLL)是沒有意義的。 考慮通過使用靜態庫來代替,方法是在CONFIG += staticlib所在的.pro文件中設置TEMPLATE = libCONFIG += staticlib 。但這是另一個主題和另一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM