1

我有源代码 fa qt 应用程序,它是由不再与我公司合作的其他人编写的。

我设法使用 qt 4.8.4 编译代码。我发现原始版本使用的是 qt 4.7.3。

当我运行应用程序时,它在一个 qt DLL 中启动后就崩溃了。

我正在 windows7 x64 上开发,但目标是 x86。我正在使用 VS 2012 并使用 VS 2012 编译 qt。

我是否需要设置任何环境变量才能使 QT 正常工作?

我是否需要安装任何其他软件(例如 opengl 或 qt 中继的任何其他库)?

编辑 1

崩溃后的堆栈是:

QtOpenGLd4.dll!QGLContextPrivate::extensionFuncs(const QGLContext * ctx) Line 467   C++
    QtOpenGLd4.dll!qt_resolve_glsl_extensions(QGLContext * ctx) Line 257    C++
    QtOpenGLd4.dll!QGLShaderPrivate::create() Line 227  C++
    QtOpenGLd4.dll!QGLShader::QGLShader(QFlags<enum QGLShader::ShaderTypeBit> type, const QGLContext * context, QObject * parent) Line 342  C++
    QtOpenGLd4.dll!QGLEngineSharedShaders::QGLEngineSharedShaders(const QGLContext * context) Line 191  C++
    QtOpenGLd4.dll!QGLContextGroupResource<QGLEngineSharedShaders>::value(const QGLContext * context) Line 777  C++
    QtOpenGLd4.dll!QGLShaderStorage::shadersForThread(const QGLContext * context) Line 63   C++
    QtOpenGLd4.dll!QGLEngineSharedShaders::shadersForContext(const QGLContext * context) Line 74    C++
    QtOpenGLd4.dll!QGLEngineShaderManager::QGLEngineShaderManager(QGLContext * context) Line 467    C++
    QtOpenGLd4.dll!QGL2PaintEngineEx::begin(QPaintDevice * pdev) Line 2150  C++
    QtGuid4.dll!QPainter::begin(QPaintDevice * pd) Line 1881    C++
    QtGuid4.dll!QPainter::QPainter(QPaintDevice * pd) Line 1508 C++
    myapp.exe!SViewer::paintEvent(QPaintEvent * __formal) Line 187  C++
    QtGuid4.dll!QWidget::event(QEvent * event) Line 8533    C++
    QtOpenGLd4.dll!QGLWidget::event(QEvent * e) Line 4408   C++
    QtGuid4.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e) Line 4562    C++
    QtGuid4.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 4527  C++
    QtCored4.dll!QCoreApplication::notifyInternal(QObject * receiver, QEvent * event) Line 946  C++
    QtCored4.dll!QCoreApplication::sendSpontaneousEvent(QObject * receiver, QEvent * event) Line 234    C++
    QtGuid4.dll!QWidgetPrivate::drawWidget(QPaintDevice * pdev, const QRegion & rgn, const QPoint & offset, int flags, QPainter * sharedPainter, QWidgetBackingStore * backingStore) Line 5598  C++
    QtGuid4.dll!QWidgetPrivate::repaint_sys(const QRegion & rgn) Line 1659  C++
    QtGuid4.dll!QWidgetPrivate::syncBackingStore() Line 1894    C++
    QtGuid4.dll!QWidget::event(QEvent * event) Line 8680    C++
    QtOpenGLd4.dll!QGLWidget::event(QEvent * e) Line 4408   C++
    QtGuid4.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e) Line 4562    C++
    QtGuid4.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 4527  C++
    QtCored4.dll!QCoreApplication::notifyInternal(QObject * receiver, QEvent * event) Line 946  C++
    QtCored4.dll!QCoreApplication::sendEvent(QObject * receiver, QEvent * event) Line 231   C++
    QtCored4.dll!QCoreApplicationPrivate::sendPostedEvents(QObject * receiver, int event_type, QThreadData * data) Line 1570    C++
    QtCored4.dll!qt_internal_proc(HWND__ * hwnd, unsigned int message, unsigned int wp, long lp) Line 496   C++
    user32.dll!75ce62fa()   Unknown
    [Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]    
    user32.dll!75ce6d3a()   Unknown
    user32.dll!75ce6ce9()   Unknown
    user32.dll!75ce77c4()   Unknown
    user32.dll!75ce788a()   Unknown
    QtCored4.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 810    C++
    QtGuid4.dll!QGuiEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 1204 C++
    QtCored4.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 150   C++
    QtCored4.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 204    C++
    QtGuid4.dll!QDialog::exec() Line 555    C++
    myapp.exe!MainWindow::actionWelcomeDialog() Line 1078   C++
    myapp.exe!MainWindow::qt_static_metacall(QObject * _o, QMetaObject::Call _c, int _id, void * * _a) Line 92  C++
    QtCored4.dll!QMetaCallEvent::placeMetaCall(QObject * object) Line 524   C++
    QtCored4.dll!QObject::event(QEvent * e) Line 1194   C++
    QtGuid4.dll!QWidget::event(QEvent * event) Line 8845    C++
    QtGuid4.dll!QMainWindow::event(QEvent * event) Line 1479    C++
    QtGuid4.dll!QApplicationPrivate::notify_helper(QObject * receiver, QEvent * e) Line 4562    C++
    QtGuid4.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 4527  C++
    QtCored4.dll!QCoreApplication::notifyInternal(QObject * receiver, QEvent * event) Line 946  C++
    QtCored4.dll!QCoreApplication::sendEvent(QObject * receiver, QEvent * event) Line 231   C++
    QtCored4.dll!QCoreApplicationPrivate::sendPostedEvents(QObject * receiver, int event_type, QThreadData * data) Line 1570    C++
    QtCored4.dll!qt_internal_proc(HWND__ * hwnd, unsigned int message, unsigned int wp, long lp) Line 496   C++
    user32.dll!75ce62fa()   Unknown
    user32.dll!75ce6d3a()   Unknown
    user32.dll!75ce6ce9()   Unknown
    user32.dll!75ce77c4()   Unknown
    user32.dll!75ce788a()   Unknown
    QtCored4.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 810    C++
    QtGuid4.dll!QGuiEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 1204 C++
    QtCored4.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 150   C++
    QtCored4.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) Line 204    C++
    QtCored4.dll!QCoreApplication::exec() Line 1218 C++
    QtGuid4.dll!QApplication::exec() Line 3824  C++
    myapp.exe!main(int argc, char * * argv) Line 26 C++
    myapp.exe!WinMain(HINSTANCE__ * instance, HINSTANCE__ * prevInstance, char * __formal, int cmdShow) Line 131    C++
    myapp.exe!__tmainCRTStartup() Line 528  C
    myapp.exe!WinMainCRTStartup() Line 377  C
    kernel32.dll!758333aa() Unknown
    ntdll.dll!77d59ef2()    Unknown
    ntdll.dll!77d59ec5()    Unknown
4

2 回答 2

1

我自己的 QT-Application 使用带有 OpenGL 的 Qt 4.8.3 时遇到了同样的问题。

我发现崩溃是由于使用了 OpenGL 绘制引擎。如果 OpenGL 驱动程序报告它支持 OpenGL 2.0,则引擎类型应自动设置为 OnegGL2。就我而言,这似乎失败了。

为了解决这个问题,我在构建我的 QT 应用程序之前通过添加以下代码来设置 OpenGL 首选绘制引擎:

QGL::setPreferredPaintEngine(QPaintEngine::OpenGL);
于 2016-03-02T07:00:00.787 回答
0

好的……这是你的洗衣单:

确保您使用 MSVS 编译器进行构建,并为 win32 进行编译。

如果您的应用程序被为 mingw 或 win64 构建的 dll 所包围,您可能刚刚输入了“DLL he**”。确保您的应用程序的 exe 旁边或工作目录(可能是您的源文件所在的文件夹)中没有任何 dll。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx#search_order_for_desktop_applications

现在去检查你的系统和用户环境变量。确保没有您不为其构建的某些 Qt 文件夹的列表。

还要确保 Qt Creator 或 Visual Studio 指向您正在构建的 Qt 版本。

对您的项目进行构建清理,然后重新构建整个项目。请务必阅读“编译输出”和“构建输出”文件夹。

尝试在调试中构建和运行您的程序。然后还尝试在发行版中构建和运行您的程序。记下应用程序输出和编译输出。

如果您在启动时仍然崩溃,请开始在整个代码中添加调试语句,以查看它在哪里死亡,或者在调试模式下运行调试版本时的断点。例如:qDebug() << Q_FUNC_INFO;在您的主要功能的顶部。

此外,当它崩溃时,请记下返回码。在谷歌中搜索返回码也可以告诉你很多关于发生了什么的事情。

还要检查您的程序所依赖的路径。

去检查你的 .pro 文件是否有你不知道的任何依赖项。

除此之外,您可能需要提供更多信息才能从我这里获得更多帮助。:)

希望有帮助。

于 2013-05-24T02:10:06.510 回答