我完成了将应用程序从Qt4迁移到Qt5,它编译了所有内容,但它在某个时刻崩溃了。我正在调试它并试图找到原因,但我已经走到了尽头:
这是堆栈:
main.cpp第373行:
TouchSwibz w(NULL, NULL, renderMode ? renderMode : AppSettings::RASTERMODE);
当它到达断点并且我试图更进一步时,它会与通常的
崩溃"此应用程序已请求运行时终止它 不寻常的方式。"
并且应用程序输出显示
QWidget: Must construct a QApplication before a QWidget
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
我想也许是因为在创建主窗口时正在初始化窗口小部件,但是可以做些什么来解决这个问题呢?什么是一个好的解决方法?我甚至都不知道这是不是真正的问题。 我使用Qt 5.2.1在Windows 7 x64下工作,使用mingw 4.8 32bit编译,应用程序也在32位。一切都使用相同的工具包编译。 我不知道我能提供什么其他有用的信息。我试着踩到QwtSlider构造函数但我不能。
答案 0 :(得分:12)
我设法通过在调试模式下编译所有库来解决它,结果发布库处于发布模式,而在调试模式下构建应用程序将导致未定义的行为发生。
答案 1 :(得分:7)
您最有可能拥有QWidget
类型的非本地实例。根据定义,这些将在main
开始执行之前初始化,因此在构造QApplication
之前。下面的代码重现了这个问题:
#include <QLabel>
#include <QApplication>
QLabel label("Hello, world!");
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
label.show();
return app.exec();
}
修复是延迟构造,直到有QApplication
个对象:
#include <QLabel>
#include <QApplication>
// Won't ever be a dangling pointer.
QPointer<QLabel> label;
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
QLabel label_("Hello, world!");
label.reset(&label_);
label->show();
return app.exec();
}
答案 2 :(得分:1)
我刚刚解决了类似的问题,这是我的详细情况和解决方案:
我使用 VS和Qt插件;
我在调试和发布模式下成功编译;
我可以在调试模式下运行它,但不能在发布版本中运行,导致按摩“必须在QWidget之前构建QApplication”。
[重要] 我首先在DEBUG模式下编译并测试它,然后我遇到了一些鼓励我使用RELEASE模式的计算阈值。
[重要] 我使用了一些与Qt GUI组件相关的第三方库,它要求您向项目添加外部依赖项。< / p>
[重要] 我只是将项目属性页面中的配置从DEBUG复制到RELEASE,如外部C ++库或外部依赖项。
我终于找到了原因。在 项目的“属性页”对话框中 - &gt;链接器文件夹 - &gt;输入属性页面 - &gt;附加依赖 ,其中一个外部库应该替换为发行版本1,在我的情况下,QGLViewerd2.lib
到QGLViewer2.lib
具有不同的名称。