天天看點

QT_bug記錄_QT+VS中fatal error C1083: 無法打開包括檔案: “ui_XXX.h”和 XXX.obj : error LNK2001: 無法解析的外部符号"public:

QT_bug記錄_QT+VS中“ui_XXX.h”和 moc_XXX.cpp無法正常生成問題

    • 一、ui_XXX.h檔案生成問題
      • 解決方法1
      • 解決方法2
    • 二、moc_XXX.cpp無法生成問題;
      • 解決方法一
      • 解決方法二

小碼哥在做算法開發的時候用的是VS+QT,需要做一些簡單的demo時,比較喜歡采用QDesigner進行界面設定。因為其操作簡單快捷,我們通過建立 QT GUI Application,并選擇你想要的基類, 就可以建立一個簡單的GUI界面應用程式,直接F5就可以顯示你剛剛建立的界面;

而有些時候我們按F5運作後,卻出現無法打開包括檔案: “ui_XXX.h” 的提示,也就是說包含目錄中沒有這檔案存在。ui_XXX.h檔案是xxx.ui檔案自動生成的,要解決這個問題就要從xxx.ui檔案下手,具體步驟如下:

一、ui_XXX.h檔案生成問題

解決方法1

此問題需要對***.ui檔案進行編譯才能生成;滑鼠右鍵點選*.ui檔案選擇編譯即可解決這個問題**

解決方法2

有些時候,“編譯”按鈕是灰色不可選的,此時需要按照以下步驟,更改***.ui檔案的部分設定,再進行編譯就能解決問題,步驟如下:

  • 1、滑鼠右鍵點選XXX.ui檔案,選擇屬性:

    無法編譯的ui檔案往往在“項類型“”中設定是不參與生成的,如下:

    QT_bug記錄_QT+VS中fatal error C1083: 無法打開包括檔案: “ui_XXX.h”和 XXX.obj : error LNK2001: 無法解析的外部符号"public:
  • 2、将”不參與生成”項更改為“ 自定義生成工具”,并點選“确定”儲存設定;
    QT_bug記錄_QT+VS中fatal error C1083: 無法打開包括檔案: “ui_XXX.h”和 XXX.obj : error LNK2001: 無法解析的外部符号"public:
  • 3、 再重新打開XXX.ui的屬性,對自定義生成工具的設定項

    對其進行如下設定即可,可以看出生成的ui_***.h檔案在工作目錄下的\GeneratedFiles檔案夾内:

    QT_bug記錄_QT+VS中fatal error C1083: 無法打開包括檔案: “ui_XXX.h”和 XXX.obj : error LNK2001: 無法解析的外部符号"public:
    參數具體設定如下:

指令行:"$(QTDIR)\bin\uic.exe" -o “.\GeneratedFiles\ui_%(Filename).h” “%(FullPath)”

說明:Uic%27ing %(Identity)…

輸出:.\GeneratedFiles\ui_%(Filename).h;%(Outputs)

附加依賴項:$(QTDIR)\bin\uic.exe;%(AdditionalInputs)

連結對象:是

将輸出視為内容:否

完成以上設定之後,即可對XXX.ui進行編譯,生成ui_XXX.h了。

二、moc_XXX.cpp無法生成問題;

vs+Qt中除了ui_XXX.h檔案有時無法正常生成之外,moc_XXX.cpp檔案也會出現無法生成的問題。一般報錯如下:

2>XXX.obj : error LNK2001: 無法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl XXX::metaObject(void)const " ([email protected]@@UEBAPEBUQMetaObject@@XZ)

2>XXX.obj : error LNK2001: 無法解析的外部符号 “public: virtual void * __cdecl XXX::qt_metacast(char const *)” ([email protected]@@[email protected])

2>XXX.obj : error LNK2001: 無法解析的外部符号 “public: virtual int __cdecl XXX::qt_metacall(enum QMetaObject::Call,int,void * *)” ([email protected]@@[email protected]@@[email protected])

moc_XXX.cpp檔案無法生成往往與XXX.h的設定有關;

解決方法一

該方法與ui_XXX_.h檔案解決方法類型,如下:

  • 1、找到moc_XXX.cpp對應的XXX.h檔案,然後右鍵單擊,選擇屬性:
  • 2、将“項類型“”中設定是不參與生成的更改為“ 自定義生成工具”;
  • 3、對“ 自定義生成工具”進行如下設定;

指令行: “$(QTDIR)\bin\moc.exe” “%(FullPath)” -o “.\GeneratedFiles$(ConfigurationName)\moc_%(Filename).cpp” -DUNICODE -D_UNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DSCISLDEPTHMEADLG_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -D_WINDLL “-I.\GeneratedFiles” “-I.” “-I$(QTDIR)\include” “-I.\GeneratedFiles$(ConfigurationName).” “-IKaTeX parse error: Expected 'EOF', got '\include' at position 8: (QTDIR)\̲i̲n̲c̲l̲u̲d̲e̲\QtCore" "-I(QTDIR)\include\QtGui” “-I$(QTDIR)\include\QtWidgets”

說明: Moc%27ing (Filename).h…

輸出: .\GeneratedFiles$(ConfigurationName)\moc_%(Filename).cpp

附加依賴性: KaTeX parse error: Expected 'EOF', got '\bin' at position 8: (QTDIR)\̲b̲i̲n̲\moc.exe;%(Full…(QTDIR)\bin\moc.exe;%(FullPath)

以上設定也可參照正确生成moc檔案的.h檔案進行設定;

完成以上設定會後,在對xxx.h檔案重新編譯,可解決問題;

解決方法二

此法用起來更加簡單友善一些,小碼哥比較推薦使用;

  • 1、右鍵單擊報錯工程,點選convert project to Qt Add-in project;
  • 2、在轉換項目之後移除xxx.h檔案,注意是移除,不是删除;
  • 3、重添加xxx.h檔案,重新添加之後應該就會出現moc_XXX.cpp檔案了;

繼續閱讀