Как правильно закрыть Qt при загрузке в качестве разделяемой библиотеки? - PullRequest
1 голос
/ 21 марта 2012

У меня есть некоторые привязки 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.

Ответы [ 2 ]

0 голосов
/ 21 марта 2012

Может ли dlclose () быть тем, кем вы хотите?

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

   The function dlclose() decrements the reference count on the dynamic library
   handle handle.  If the reference count drops to zero and no other loaded
   libraries use symbols in it, then the dynamic library is unloaded.

   The function dlclose() returns 0 on success, and nonzero on error.

Например:

#ifdef MAC_OS
    // unload library for MAC
#else //if linux
    dlclose(lib_handle);
#endif
0 голосов
/ 21 марта 2012

Не совсем уверен, что ваш вопрос, но вы можете явно указать приложению Qt выйти с app:quit()

...