使用Qt常见报错及解决方案

最近使用Qt创建工程项目遇到了一些常见的报错,现将报错内容和解决方案整理记录如下:1. 缺插件导致无法运行This application failed to start because no Qt platformplugin could be initialized. Reinstalling the application may fix this problem.因为Qt平台插件没有初始化,软件无法正常运行。解决方案:方案1: 在应用程序根目录同级目录创建文件夹platforms,
摘要由CSDN通过智能技术生成

最近使用Qt创建工程项目遇到了一些常见的报错,现将报错内容和解决方案整理记录如下:

1. 缺插件导致无法运行

This application failed to start because no Qt platform
plugin could be initialized. Reinstalling the application may fix this problem.
因为Qt平台插件没有初始化,软件无法正常运行。

解决方案:

方案1: 在应用程序根目录同级目录创建文件夹platforms,将qwindowsd.dll或者qwindows.dll复制至文件夹platforms
方案2: Qt为了简化生成发布版本,特别提供了工具windeplayqt.exe。,这个工具在...\Qt5.8.0\5.8\msvc2015_64\bin的目录下,通过该命令,可以解决上述错误。

  1. 打开控制台窗口
  2. 设置搜索路径以便系统可以搜索到 “windeployqt.exe”
  3. 运行 “windeplayqt.exe F:\work\project\sample\bin\Release\sample.exe”, 所需要的Qt运行库就自动拷贝到目标程序目录了。

2. 报错 error LNK2001

error LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const watxtract::QPropertyBrowser::staticMetaObject” (?staticMetaObject@QPropertyBrowser@watxtract@@2UQMetaObject@@B)

error LNK2001是缺少函数定义的常见报错,报这个错通常是由于某个类MyClass从Qt继承,并使用了Q_OBJECT宏,一旦使用了这个宏,就需要使用Qt元对象编译器(Meta Object Compiler)进行预编译。经过MOC预编译后的类MyClass​会以文件名moc_mylass.cpp的方式自动加入工程。而一旦因为某些原因没有经过MOC预处理,没有相应的moc_*.cpp就会报这种错误。

解决方案:

方案1: 使用QMake创建工程,使用Qt Creator进行编译。通常QMake创建的工程经Qt Creator打开(或者VS中Qt VS Tools),会自动为使用Q_OBJECT宏的类生成moc预处理文件,再次编译就不会报错。

方案2: 如果是需要使用VS编译一个Qt工程,并且没有QMake创建的pro工程文件,可以使用CMake创建Qt工程,在CMake中定义AUTOMOC属性,自动进行moc预编译。

set (CMAKE_AUTOMOC ON)

不过AUTOMOC并非总是有效,一般来说对于cpp文件与h文件在同一个文件夹的情形,CMake自动分析创建Moc文件就是有效的。而有时候一个工程的cpp文件与h文件可能放置在不同的文件夹,此时AUTOMOC就失效了。

这个时候需要使用qt4_wrap_cppqt5_wrap_cpp(虽然CMake官方文档不推荐使用这一方法,但是对于复杂的moc文件替换,只能采用手动操作)。一个替换例子如下:

project(gui)

# automoc failed
##set (CMAKE_AUTOMOC ON)         
set (CMAKE_AUTORCC ON)
set (CMAKE_AUTOUIC ON)

function(func_add_executabl
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值