C++ 必须在QWidget之前构造QApplication&;传递给C运行时函数的参数无效

C++ 必须在QWidget之前构造QApplication&;传递给C运行时函数的参数无效,c++,qt,debugging,C++,Qt,Debugging,我完成了一个应用程序从Qt4到Qt5的迁移,它进行了编译,但在某一点上崩溃了。我正在调试它,并试图找出原因,但我已经走到了死胡同: 以下是堆栈: main.cpp第373行: TouchSwibz w(NULL, NULL, renderMode ? renderMode : AppSettings::RASTERMODE); 当它到达断点时,我尝试进一步操作,它会以通常的方式崩溃 “此应用程序已请求运行时在 不寻常的方式。” 应用程序输出显示 QWidget: Must construct

我完成了一个应用程序从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.
我认为这可能是因为在创建主窗口时小部件正在初始化,但是如何解决这个问题呢?什么是好的解决办法?我甚至不知道这是否是真正的问题。 我在Windows7x64下工作,使用Qt5.2.1,使用MingW4.8 32位编译,应用程序也是32位的。所有内容都使用相同的工具包进行编译。
我不知道我还能提供什么有用的信息。我尝试进入QwtSlider构造函数,但我做不到。

您很可能有
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();
}

我通过在调试模式下编译所有库来解决这个问题,结果表明,在调试模式下构建应用程序时,在发布模式下使用库会导致出现未定义的行为。

我刚刚解决了一个类似的问题,下面是我的详细情况和解决方案:

  • 我将VS与Qt附加组件一起使用

    • Qt版本为5.7 64位(但这并不重要)
  • 我在调试和发布模式下都编译成功

  • 我可以在调试模式下运行它,但不能在发布模式下运行,因为在发布模式下,“必须在QWidget之前构建QApplication”

  • [重要]我首先在调试模式下编译并测试了它,然后遇到了一些鼓励我使用发布模式的计算阈值

  • [重要]我使用了一些与Qt GUI组件相关的第三方库,它要求您向项目添加外部依赖项

  • <> >强> >重要> >我只需将项目属性页中的配置从调试调试到发布,如EXPLAL C++库或外部依赖项。


我终于找到了原因。在项目的属性页对话框->链接器文件夹->输入属性页->其他依赖项中,一个外部库应替换为发行版库,在我的例子中,它的名称不同,
QGLViewerd2.lib
QGLViewer2.lib
,相反,它在调试模式下崩溃,并尝试发布,但确实有效。在调试模式下编译库,并在调试模式下设置应用程序,问题就解决了。我的天哪,我在这里真是个傻瓜。不幸的是,您不能在Windows中将调试与发布二进制文件混合使用。在Linux中,没有问题。
#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();
}