[QT_021]VS_Qt 常见错误

本文转自:VS_Qt 常见错误(持续更新) - fengMisaka - 博客园

本文参考:详解讲解 Qt 编程过程中出现问题-51CTO.COM

VS+QT需要获得.ui对应的ui_XXXX.h头文件的解决方法

解决办法:

(1)在 Qt5.11.2\5.11.2\mingw53_32\bin 目录下有对应的 uic.exe 用来生成 .ui 对应的 ui_XXXX.h 头文件,所以 cmd 进入 bin 目录,运行uic XXXX.ui ui_XXXX.h就可以生成。

(2)在 VS 下,右键 .ui 文件 -> "编译",就会生成对应的 ui_XXXX.h 头文件,但默认的 ui_XXX.h 输出目录是$(IntDir)\uic\%(RelativeDir),在工程所在的 Debug\uic 目录下,而实际需要修改在自定义的 GeneratedFiles 目录下,右键 .ui 文件 -> "配置属性" -> “uic”,修改输出目录为GeneratedFiles\

QT -1: error: [debug/qrc_images.cpp] 异常解决

运行报错:

-1: error: [debug/qrc_images.cpp]

解决办法:
右键 .qrc 文件,点击 open in editor 后出现的红色就是误删遗留下来的问题,删掉重新编译即可。

问题:
在用 VS2015 编译网上别人的源码时,出现了 LINK : fatal error LNK1158: 无法运行“rc.exe” 的问题。

解决方法:
打开 C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64 文件夹(找不到可以用 Everything 搜 "rc.exe"),复制里边的 “rc.exe” 和 "rcdll.dll",拷贝到 VS2015 的 VC 下的 bin 目录下,我的是 E:\technology\VS 2015\VC\bin,重新 build 即成功。
(这个问题应该是最近对 VS 进行过修改,或者环境变量变了,其实将这个路径加到环境变量的 PATH 中去也是可以的)

undefined reference to `vtable for’”问题的原因及解决方法

原因:

Qt 中,类要支持信号与槽机制,需要继承自 QObject 并在头文件开头添加 Q_OBJECT 宏。
如果使用 QtCreator 创建类时,没有选择继承自 QObject 类或其子类,而在创建后手工修改继承自 QObject 并手动添加 Q_OBJECT 宏,则在编译时有可能会出现 ”undefined reference to `vtable for’…….” 错误.

解决方法:

把新创建的类从项目中移除(主要不要从磁盘上删除),然后再添加进来,QtCreator就会重新解析此类,再编译就不再会出现上述错误。

Qt Creator提示无法用“UTF-8”编码解码,无法编辑

问题:

在 Qt Creator 里打开其他编辑器的代码时,有时会提示无法用 “UTF-8” 编码解码,无法编辑。

解决方法:

(1)找到源文件,在文件上右键使用 Notepad++ 编辑器打开,选择 ---> “编码” --->“转为UTF-8编码”

(2)windows环境下,Qt Creator,菜单 -> 工具 -> 选项 -> 文本编辑器 ->行为 -> 文件编码:默认编码:System(简体中文Windows系统默认指的是GBK编码,即下拉框选项里的GBK/windows-936-2000/CP936/windows-936)

error LNK2019: 无法解析的外部符号 __imp__recv@16,该符号在函数 _*** 中被引用

出现这个错误,一般都是缺少了相关的库文件,可以右键点击项目,选择属性,选择链接器,选择输入,选择附加依赖项,在依赖项里添加相应的库文件,这里是 ws2_32.lib 文件,然后就可以了。

error: unknown type name 'class' 的解决方法

编译工程时出现以下错误:

error: unknown type name 'class'

原因:

C 文件 include 了带有 C++ 关键字的头文件,如 class 等。因此,包含 C++ 关键字的头文件被 C 编译器所编译,而不是用 C++ 编译器编译,而 C 编译器无法识别 C++ 的关键字,所以报错。

解决方法:

1、不能在 C 文件中包含 C++ 的头文件,所以需要将 .c 改成 .cpp。

2、在所有使用 C++ 方法的地方加上:#ifdef __cplusplus,如:

#ifdef __cplusplus

class A{

};

#endi

注:如果使用了 extern "C" ,也要加上 #ifdef __cplusplus,因为 C 编译器无法识别 extern "C"。

fatal error C1083: 无法打开包括文件:“unistd.h”: No such file or directory

许多在 Linux 下开发的 C 程序都需要头文件 unistd.h,但 VC 中没有个头文件,所以用 VC 编译总是报错。把下面的内容保存为 unistd.h,可以解决这个问题。

#ifndef _UNISTD_H
#define _UNISTD_H

#include <io.h>
#include <process.h>

#endif /* _UNISTD_H */

fatal error LNK1281: 无法生成 SAFESEH 映像

解决方法:

1.打开该项目的“属性页”对话框。

2.单击“链接器”文件夹。

3.单击“命令行”属性页。

4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用。

找不到Qt5Cored.dll

Qt5Cored.dll 和 Qt5Core.dll 文件分别用于 Qt 软件的 Debug 版和 Release 版。

通常会有两个 Qt5Core.dll 文件,分别位于 Qt 安装目录下的 “Qt5.11.2\5.11.2\mingw48_32\bin” 和 “\Qt5.11.2\Tools\QtCreator\bin” 两个目录中。其中 “Qt5.11.2\5.11.2\mingw48_32\bin” 目录下才是 Qt 项目运行时所需的库。

但是,有时候在运行 Release 版项目时,却提示没有找到 Qt5Cored.dll。这是由于在编译 Release 版时,错误的链接到了 Debug 版的库上。这种情况主要发生在使用了第三方软件库的时候,在编译第三方软件库时,Debug 版本库链接到 Qt 的 Qt5Cored.dll,而 Release 版链接到 Qt5Core.dll,如果在编译 Release 版项目时错误的链接了第三方软件库的 Debug 版,则也会间接的链接 Debug 版的相关支持库(如 Qt5Cored.dll),因此在运行项目时提示需要相关的 Debug 版支持库。

举个例子:在编译 Release 版项目时,工程文件中有 “#LIBS += D:/Qwt-6.1.0/lib/qwtd.dll”(这是 QWT 库,QWT 库需要 QT 库的支持),则在运行时提示 “找不到Qt5Cored.dll文件”,这时将其修改为 “#LIBS += D:/Qwt-6.1.0/lib/qwt.dll” 则解决问题。

正确解决:坑爹的0xc000007b——应用程序无法正常启动

(1)根本原因是缺乏所需要的 DLL,提供了错误版本的 dll 相当于没有 DLL, 提示完全一样。

(2)网上有人说缺乏 dx 运行环境,如果属实,也是因为缺乏 dx 相关的 dll。

(3)与程序是 32 还是 64 位没有直接关系,但是与你的程序对应不上的 dll 版本,往往很难发现问题,要引起注意。

(4)生成的 debug 目录下,运行 exe 文件报改错,将缺少的 dll 文件添加进来即可解决,例如 opencv_world411d.dll。

弹窗崩溃:abort() has been called 错误分析及其解决方法

调试代码的过程中经常会遇到 abort() has been called 的错误,导致出现这样的原因有:

(1)内存泄漏,导致内存不够分配;

(2)非法指针访问或者指针访问内存越界出现问题;
(3)多线程访问资源出的问题。

参考:R6010 -abort() has been called错误分析及其解决方法

This application failed to start because it could not find or load the Qt platform plugin “windows” 错误解决方法

用 inno setup 打包生成了一个安装 exe,U 盘拷到另一台电脑安装运行,出现该错误!

根据错误提示发现是和 platform 有关,是因为前面误删了安装目录下的 platforms 文件夹以及其内部的 qwindows.dll,把 plugins/platform 这个文件夹原封不动地复制到安装包里再打包即可。

Qt中文乱码问题

方法一:

ui->pushButton->setText(QString::fromLocal8Bit("我是中文"));

方法二:

将默认字体设置为 UTF8,再配合 tr("我是中文") 就不会乱码啦。

解决Qt线程关闭问题!QThread: Destroyed while thread is still running

耗时操作里面这样判断:

 while (!isInterruptionRequested())

添加析构函数,析构函数里面这样操作:

XXXThread:: ~XXXThread()
{
    requestInterruption();
    quit();
    wait();
}

给放在 Program Files 目录下的 exe 添加写入权限

由于 exe 会在本目录下,写入 .ini 文件,如果把 exe 制作成安装包,会安装到 program files 目录下,但在 win10 下 program files 默认是没有写入权限的。

解决方法:

vs => 项目属性 =>配置属性 => 链接器 => 清单文件 =>UAC执行级别修改成 requireAdministrator。

error LNK2001:无法解析的外部符号_imp_timeGetTime@0

解决方法:将库winmm.lib添加到工程中。

参考:error LNK2001:无法解析的外部符号_imp_timeGetTime@0

error LNK2019: 无法解析的外部符号

加入头文件出现 chrono 和 ratio 的错误

在一个使用 FFmepg 的多线程工程中加入 librtmp 第三方开源库,在 chrono 和 ratio 中就会报二十多个错误,尤其是 C4430错误,“C4430 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int” 这个错误,在网上找了很多方法均不行,直到找到这个解决办法,前提是先include <stdint.h>

VS => 项目属性 =>配置属性 => C/C++ => 预处理器中加入: __STDC_LIMIT_MACROS

扩展:c++ - C++: __STDC_LIMIT_MACROS__STDC_CONSTANT_MACROS意味著什麼?

__STDC_LIMIT_MACROS 和 __STDC_CONSTANT_MACROS 是一种解决办法,允许 C++ 程序使用标准中指定的stdint.h 宏,而不在 C++ 标准中。 宏( 如 UINT8_MAX 。INT64_MIN 和 INT32_C() ) 可能已经在 C++ 应用程序中定义为其他方式。 为了允许用户口決定是否需要为 C 定义宏,许多实现需要在 stdint.h 包含之前定义 __STDC_LIMIT_MACROS 和 __STDC_CONSTANT_MACROS 。

参考:

加入头文件出现ratio和chrono的错误

每个C11和C ++ 11,<stdint.h>不应查看__STDC_LIMIT_MACROS或__STDC_CONSTANT_MACROS

ffmpeg Common.h error C3861: “UINT64_C”: 找不到标识符

解决方法:在 common.h 中添加如下代码:

#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif

#ifdef __cplusplus
#define __STDC_CONSTANT_MACROS
#ifdef _STDINT_H
#undef _STDINT_H
#endif
# include <stdint.h>
#endif

顺便解决了fatal error C1189: #error : missing -D__STDC_FORMAT_MACROS这个错误。

ERROR: WriteN, RTMP send error 10054 (39 bytes)

时间戳过大会导致该错误。原先错误将时间戳单位弄错了,时间戳过大,大了 1000 倍导致的。

VS出现 fatal error C1083: 无法打开包括文件: “sys/socket.h”: No such file ....

因为 sys/socket.h 是 Linux 系统下的库文件,所以在 windows 上无法打开,用#include <winsock.h>替换即可。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值