如何在作为共享库加载的情况下正确关闭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
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
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我不是完全确定你的问题是什么,但你可以显式地告诉 Qt 应用程序使用
app:quit()
退出。