如何在作为共享库加载的情况下正确关闭Qt?

我有一些Lua绑定到Qt,它们在mac os x(Qt 4.8.0)上工作正常,但在Ubuntu linux(Qt 4.7.4)上崩溃。 Qt代码通过dlopen加载,然后通过app-> exec()将执行权传递给Qt。

Lua代码:

“` require 'mimas'--加载链接到Qt libs的共享库mimas.so app = mimas.Application()--只是围绕QApplication的包装器 app:exec()

  • 在某些回调中:app:quit()

“`

当Lua退出时(在app:exec()返回后),它会在'mimas'共享库上进行dlclose,最终导致SIGSEGV。回溯:

程序接收到SIGSEGV,段错误。 QList<QFactoryLoader *>::removeAll(this = 0x0,_t = @ 0xbfffebac) 在../../include/QtCore/../../src/corelib/tools/qlist.h中:760 760 ../../include/QtCore/../../src/corelib/tools/qlist.h:没有这样的文件或目录。 在../../include/QtCore/../../src/corelib/tools/qlist.h中 (gdb)BT #0 QList<QFactoryLoader *>::removeAll(this = 0x0,_t = @ 0xbfffebac) 在../../include/QtCore/../../src/corelib/tools/qlist.h中:760 #1 0x0131126c中的QFactoryLoader ::〜QFactoryLoader(this = 0x8104a48, __in_chrg = <optimized out>)// plugin / qfactoryloader.cpp:208 #2 0x01311302中的QFactoryLoader ::〜QFactoryLoader(this = 0x8104a48, __in_chrg = <optimized out>)// plugin / qfactoryloader.cpp:209 #3 0x009143a8中的QGlobalStaticDeleter <QFactoryLoader> ::〜QGlobalStaticDeleter( 此时= 0x11c3200,__in_chrg = <optimized out>) 在../../include/QtCore/../../src/corelib/global/qglobal.h:1825中 #4 0x001e7d2b中的__ cxa_finalize()来自/lib/i386-linux-gnu/libc.so.6 #5 0x00842a94在__ do_global_dtors_aux() 来自/usr/lib/i386-linux-gnu/libQtGui.so.4 [删除] #13 0x0016bd28中的dlclose()来自/lib/i386-linux-gnu/libdl.so.2 “

如何正常关闭Qt,使其不会出现此内存错误?

问题似乎是[qt_factory_loaders()](http://qt.gitorious.org/qt/qt/blobs/4.7/src/corelib/plugin/qfactoryloader.cpp#line208)返回NULL。 我将尝试使用Qt 4.8.0,以查看事情是否发生了变化。

[EDIT]我可以缩小问题范围(与Lua无关),并向Qt填写[错误报告](https://bugreports.qt-project.org/browse/QT BUG-24945)。

原文链接 https://stackoverflow.com/questions/9805505

点赞
stackoverflow用户363132
stackoverflow用户363132

我不是完全确定你的问题是什么,但你可以显式地告诉 Qt 应用程序使用 app:quit() 退出。

2012-03-21 13:41:29
stackoverflow用户958953
stackoverflow用户958953

dlclose() 可能是你想要的吗?

http://www.kernel.org/doc/man-pages/online/pages/man3/dlsym.3.html

函数 `dlclose()` 会使动态链接库句柄 `handle` 上的引用计数减 1。当引用计数降为零且没有其它已加载的库使用其中的符号时,该动态链接库会被卸载。

函数 `dlclose()` 成功执行时返回 0,否则返回非零值。

例如:

#ifdef MAC_OS
    // 卸载 MAC 的库
#else //if linux
    dlclose(lib_handle);
#endif
2012-03-21 13:48:12