最近使用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
的目录下,通过该命令,可以解决上述错误。
- 打开控制台窗口
- 设置搜索路径以便系统可以搜索到 “windeployqt.exe”
- 运行 “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_cpp
或qt5_wrap_cpp
(虽然CMake官方文档不推荐使用这一方法,但是对于复杂的moc文件替换,只能采用手动操作)。一个替换例子如下:
project(gui)
# automoc failed
##set (CMAKE_AUTOMOC ON)
set (CMAKE_AUTORCC ON)
set (CMAKE_AUTOUIC ON)
function(func_add_executabl