【发布时间】:2014-09-30 16:21:01
【问题描述】:
我一直在通过 qmlRegisterType 玩 QML 应用程序和扩展,我偶然发现了一件奇怪的事情:我有 2 个项目。第一个生成具有自定义 QML 类型的 dll,第二个是一个非常简单的应用程序,如下所示:
main.cpp:
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine(QUrl("qrc:/main.qml"));
return app.exec();
}
main.qml
import QtQuick 2.3
import QtQuick.Window 2.2
import TestLib 1.0
Window {
visible: true
width: 360
height: 360
MouseArea {
anchors.fill: parent
onClicked: {
Qt.quit();
}
}
HelloWorld {
id: hello
test: "Foo !!"
}
Text {
anchors.centerIn: parent
text: hello.test
font.pointSize: 40
}
}
当我通过 Qt Creator 运行我的项目时,一切正常,当我单击窗口上的任意位置时,它会正常关闭。
但是现在,如果我尝试通过 Visual Studio 项目编译完全相同的代码(我使用 Premake 的特殊版本来生成正确处理 Qt 特殊文件的 Visual Studio 解决方案和项目文件),那么一切都会编译、运行很好,但是只要我点击窗口,我就会崩溃,下面的调用堆栈:
ntdll.dll!RtlFreeHeap() Unknown
kernel32.dll!HeapFree() Unknown
msvcr120.dll!free(void * pBlock) Line 51 C
TestLib.dll!000007fef7bb6d6c() Unknown
Qt5Cored.dll!QObjectPrivate::deleteChildren() Line 1936 C++
Qt5Cored.dll!QObject::~QObject() Line 1030 C++
Qt5Quickd.dll!QQuickItem::~QQuickItem() Line 2120 C++
Qt5Quickd.dll!QQuickRootItem::~QQuickRootItem() C++
Qt5Quickd.dll!QQuickRootItem::`scalar deleting destructor'(unsigned int) C++
Qt5Quickd.dll!QQuickWindow::~QQuickWindow() Line 1102 C++
Qt5Quickd.dll!QQuickWindowQmlImpl::~QQuickWindowQmlImpl() C++
Qt5Quickd.dll!QQmlPrivate::QQmlElement<QQuickWindowQmlImpl>::~QQmlElement<QQuickWindowQmlImpl>() Line 106 C++
Qt5Quickd.dll!QQmlPrivate::QQmlElement<QQuickWindowQmlImpl>::`scalar deleting destructor'(unsigned int) C++
Qt5Qmld.dll!qDeleteAll<QList<QObject * __ptr64>::const_iterator>(QList<QObject *>::const_iterator begin, QList<QObject *>::const_iterator end) Line 323 C++
Qt5Qmld.dll!qDeleteAll<QList<QObject * __ptr64> >(const QList<QObject *> & c) Line 332 C++
Qt5Qmld.dll!QQmlApplicationEnginePrivate::cleanUp() Line 64 C++
Qt5Qmld.dll!QQmlApplicationEngine::~QQmlApplicationEngine() Line 241 C++
TestApp.exe!000000013faf2630() Unknown
TestApp.exe!000000013faf4197() Unknown
我花了很多时间浏览 Google 等,但找不到任何有用的东西。我想我的项目中可能缺少一些编译选项,Qt Creator 会自动添加,但我不知道是哪一个:/
我知道仅仅看这个问题可能不足以找到解决方案,所以我准备了一个完美重现问题的小项目。如果您愿意尝试,请随时给我留言,我会发送给您(很遗憾,我没有任何 Dropbox 帐户或等效帐户)
提前感谢您的帮助!
【问题讨论】:
-
我担心 msvcr120.dll。我本来希望 msvcr120d.dll 代替。我提到这一点的原因是在 Debug 应用程序中使用 Release dll 或在发布应用程序中使用 Debug dll 是不安全的(由于超过 1 个独立堆而没有隔离)。
-
现在我觉得真的很愚蠢,我切换到调试运行时,它现在正常关闭了......非常感谢,我本可以花更多时间才注意到这一点!
标签: qt visual-c++