У меня есть некоторые привязки Lua к Qt, которые работают находят на Mac OS X (Qt 4.8.0), но сбой на Ubuntu Linux (Qt 4.7.4). Код Qt загружается с помощью dlopen, а затем выполнение передается в Qt с помощью app-> exec ().
Код Lua:
require 'mimas' -- Load shared library mimas.so linked to Qt libs
app = mimas.Application() -- Just a wrapper around QApplication
app:exec()
-- In some callback: app:quit()
Когда Lua завершает работу (после возврата app: exec ()), он выполняет dlclose для разделяемой библиотеки 'mimas', которая заканчивается в SIGSEGV. Backtrace:
Program received signal SIGSEGV, Segmentation fault.
QList<QFactoryLoader*>::removeAll (this=0x0, _t=@0xbfffebac)
at ../../include/QtCore/../../src/corelib/tools/qlist.h:760
760 ../../include/QtCore/../../src/corelib/tools/qlist.h: No such file or directory.
in ../../include/QtCore/../../src/corelib/tools/qlist.h
(gdb) bt
#0 QList<QFactoryLoader*>::removeAll (this=0x0, _t=@0xbfffebac)
at ../../include/QtCore/../../src/corelib/tools/qlist.h:760
#1 0x0131126c in QFactoryLoader::~QFactoryLoader (this=0x8104a48,
__in_chrg=<optimized out>) at plugin/qfactoryloader.cpp:208
#2 0x01311302 in QFactoryLoader::~QFactoryLoader (this=0x8104a48,
__in_chrg=<optimized out>) at plugin/qfactoryloader.cpp:209
#3 0x009143a8 in QGlobalStaticDeleter<QFactoryLoader>::~QGlobalStaticDeleter (
this=0x11c3200, __in_chrg=<optimized out>)
at ../../include/QtCore/../../src/corelib/global/qglobal.h:1825
#4 0x001e7d2b in __cxa_finalize () from /lib/i386-linux-gnu/libc.so.6
#5 0x00842a94 in __do_global_dtors_aux ()
from /usr/lib/i386-linux-gnu/libQtGui.so.4
[snip]
#13 0x0016bd28 in dlclose () from /lib/i386-linux-gnu/libdl.so.2
Как правильно закрыть Qt, чтобы он не заканчивался этой ошибкой памяти?
Кажется, проблема в том, что qt_factory_loaders () возвращает NULL. Я попробую с Qt 4.8.0 посмотреть, изменились ли вещи.
[РЕДАКТИРОВАТЬ] Я мог бы сузить проблему (это не связано с Lua) и заполнить отчет об ошибке до qt.