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无法正常生成问题
小码哥在做算法开发的时候用的是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文件往往在“项类型“”中设置是不参与生成的,如下: -
2、将”不参与生成”项更改为“ 自定义生成工具”,并点击“确定”保存设置;
-
3、 再重新打开XXX.ui的属性,对自定义生成工具的设置项
对其进行如下设置即可,可以看出生成的ui_***.h文件在工作目录下的\GeneratedFiles文件夹内:
参数具体设置如下:
命令行:"$(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]@@[email protected]@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文件了;