Russian Qt Forum
Ноябрь 25, 2024, 06:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Qt и плагины (undefined symbol)  (Прочитано 21459 раз)
zodiac
Гость
« : Февраль 26, 2008, 18:03 »

Плагинный интерфейс:
Код:
#include <QObject>
#include <QtCore>
#include <QString>

class pluginInterface : public QObject
{
public:
virtual ~pluginInterface() {}
virtual QString getAuthor() = 0;
};

Q_DECLARE_INTERFACE (pluginInterface, "zodiac.pluginInterface/1.0")

Плагин:
Код:
#include <QtCore>
#include "../pluginInterface.h"

class testPlugin : public pluginInterface
{
Q_OBJECT
Q_INTERFACES(pluginInterface)

public:
QString getAuthor()
{
return "zodiac";
}
};

Q_EXPORT_PLUGIN(testPlugin);

Вызов из программы:
Код:
	pluginsDir = QDir(qApp->applicationDirPath());

pluginsDir.cd("plugins");

foreach (pluginFileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader loader(pluginsDir.absoluteFilePath(pluginFileName));
plugin = loader.instance();

QMessageBox::information(0, "!!!", loader.errorString());
}

Выдает следущее:
QLibrary::load_sys: Cannot load /home..../libtest_plugin.so (/home..../libtest_plugin.so: undefined symbol: _ZTV10testPlugin)
Что это за такой undefined symbol? Везде происказ, ничего не нашел нужного:(
Записан
vregess
Гость
« Ответ #1 : Февраль 26, 2008, 18:40 »

попробуй Q_EXPORT_PLUGIN2
Записан
zodiac
Гость
« Ответ #2 : Февраль 26, 2008, 18:52 »

Сделал так: Q_EXPORT_PLUGIN2(testPlugin, testPlugin);
Все равно также выскакивает.
Записан
BRE
Гость
« Ответ #3 : Февраль 26, 2008, 19:05 »

Попробуй так:
class pluginInterface
{
...
};

class testPlugin : public QObject, public pluginInterface
{
...
};

Читай внимательно Assistant.  Подмигивающий
Записан
zodiac
Гость
« Ответ #4 : Февраль 26, 2008, 19:11 »

Код:
#include <QtCore>
#include "../pluginInterface.h"

class testPlugin : public QObject, public pluginInterface
{
Q_OBJECT
Q_INTERFACES(pluginInterface)

public:
QString getAuthor()
{
return "zodiac";
}
};

Q_EXPORT_PLUGIN2(testPlugin, testPlugin);

Код:
#include <QObject>
#include <QtCore>
#include <QString>

class pluginInterface
{
public:
virtual ~pluginInterface() {}
virtual QString getAuthor() = 0;
};

Q_DECLARE_INTERFACE (pluginInterface, "zodiac.pluginInterface/1.0")

все равно. ассистента читал, по-всякому уже пробовал
Записан
BRE
Гость
« Ответ #5 : Февраль 26, 2008, 19:25 »

Может дело в этом?

When building plugins to extend an application, it is important to ensure that the plugin is configured in the same way as the application. This means that if the application was built in release mode, plugins should be built in release mode, too.
If you configure Qt to be built in both debug and release modes, but only build applications in release mode, you need to ensure that your plugins are also built in release mode. By default, if a debug build of Qt is available, plugins will only be built in debug mode. To force the plugins to be built in release mode, add the following line to the plugin's project file:
 CONFIG += release
This will ensure that the plugin is compatible with the version of the library used in the application.
Записан
zodiac
Гость
« Ответ #6 : Февраль 26, 2008, 19:34 »

Не помогло.
Код:
zodiac@zodiac ~/Desktop/crypt/main/plugins $ nm libtest_plugin.so
00002034 d DW.ref.__gxx_personality_v0
00001e6c a _DYNAMIC
00001ff4 a _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
         U _Unwind_Resume@@GCC_3.0
00002040 b _ZGVZ18qt_plugin_instanceE9_instance
         U _ZN11QMetaObject11changeGuardEPP7QObjectS1_
         U _ZN11QMetaObject11removeGuardEPP7QObject
00000be0 W _ZN15pluginInterfaceD0Ev
00000c10 W _ZN15pluginInterfaceD1Ev
         U _ZN7QObjectC2EPS_
00001e64 V _ZTI15pluginInterface
00000ca0 V _ZTS15pluginInterface
         U _ZTV10testPlugin
00001e50 V _ZTV15pluginInterface
         U _ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
00002048 b _ZZ18qt_plugin_instanceE9_instance
         U _ZdlPv@@GLIBCXX_3.4
         U _Znwj@@GLIBCXX_3.4
....
Может поможет как-то? (где-то на англ. форуме про nm вычитал)
Записан
Вячеслав
Гость
« Ответ #7 : Февраль 26, 2008, 19:40 »

Конструктора может сделать ? Ы ?
Записан
BRE
Гость
« Ответ #8 : Февраль 26, 2008, 19:41 »

Не помогло.
Код:
zodiac@zodiac ~/Desktop/crypt/main/plugins $ nm libtest_plugin.so
00002034 d DW.ref.__gxx_personality_v0
00001e6c a _DYNAMIC
00001ff4 a _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
         U _Unwind_Resume@@GCC_3.0
00002040 b _ZGVZ18qt_plugin_instanceE9_instance
         U _ZN11QMetaObject11changeGuardEPP7QObjectS1_
         U _ZN11QMetaObject11removeGuardEPP7QObject
00000be0 W _ZN15pluginInterfaceD0Ev
00000c10 W _ZN15pluginInterfaceD1Ev
         U _ZN7QObjectC2EPS_
00001e64 V _ZTI15pluginInterface
00000ca0 V _ZTS15pluginInterface
         U _ZTV10testPlugin                                            <<<<<<<<<<<<<<<<<<<<<<<<
00001e50 V _ZTV15pluginInterface
         U _ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
00002048 b _ZZ18qt_plugin_instanceE9_instance
         U _ZdlPv@@GLIBCXX_3.4
         U _Znwj@@GLIBCXX_3.4
....
Может поможет как-то? (где-то на англ. форуме про nm вычитал)

Странно, вот тот symbol, которого ему не хватает. А точно пытаешься загрузить именно этот файл, может старый файл остался в директории откуда грузишь плагин?
Записан
Вячеслав
Гость
« Ответ #9 : Февраль 26, 2008, 19:44 »

Не помогло.
Код:
zodiac@zodiac ~/Desktop/crypt/main/plugins $ nm libtest_plugin.so
00002034 d DW.ref.__gxx_personality_v0
00001e6c a _DYNAMIC
00001ff4 a _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
         U _Unwind_Resume@@GCC_3.0
00002040 b _ZGVZ18qt_plugin_instanceE9_instance
         U _ZN11QMetaObject11changeGuardEPP7QObjectS1_
         U _ZN11QMetaObject11removeGuardEPP7QObject
00000be0 W _ZN15pluginInterfaceD0Ev
00000c10 W _ZN15pluginInterfaceD1Ev
         U _ZN7QObjectC2EPS_
00001e64 V _ZTI15pluginInterface
00000ca0 V _ZTS15pluginInterface
         U _ZTV10testPlugin                                            <<<<<<<<<<<<<<<<<<<<<<<<
00001e50 V _ZTV15pluginInterface
         U _ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
00002048 b _ZZ18qt_plugin_instanceE9_instance
         U _ZdlPv@@GLIBCXX_3.4
         U _Znwj@@GLIBCXX_3.4
....
Может поможет как-то? (где-то на англ. форуме про nm вычитал)

Странно, вот тот symbol, которого ему не хватает. А точно пытаешься загрузить именно этот файл, может старый файл остался в директории откуда грузишь плагин?
А U это не undefined случаем ?
Записан
BRE
Гость
« Ответ #10 : Февраль 26, 2008, 19:50 »

А U это не undefined случаем ?
Парюсь, именно это.  Смеющийся
А вот что ему надо???
Записан
BRE
Гость
« Ответ #11 : Февраль 26, 2008, 19:54 »

Ну попробуй так:
Q_EXPORT_PLUGIN2(testplugin, testPlugin);

Это я Echo Plugin Example смотрю.  Подмигивающий
Записан
Вячеслав
Гость
« Ответ #12 : Февраль 26, 2008, 20:02 »

Таки вять того ,кто умеет из _ZTV10testPlugin сделать нормальное имя и поглядеть - кто нужен ....
А вообще сделай плагину конструктора и деструктора - может полегчает Подмигивающий
Записан
BRE
Гость
« Ответ #13 : Февраль 26, 2008, 20:08 »

Пересобери весь проект (make distclean; qmake-qt4; make), этот символ определяется в moc-файле. Похоже moc файл не подключается.
Записан
vaprele07
Гость
« Ответ #14 : Февраль 27, 2008, 04:30 »

Q_EXPORT_PLUGIN2(testplugin, testPlugin) вот это у тебя должно где находиться? Улыбающийся правильно! где-нибудь в объектном модуле, а оно у тебя в заголовке...

и еще интересное для qobject_cast важен порядок:
Код:
class testPlugin : public QObject, public pluginInterface
к примеру так работать не будет:
Код:
class testPlugin : public pluginInterface, public QObject

подмечу на счет конструкторов они не вызываются, а методы  testPlugin имеют статичную форму...
для полноты используй фабрику... к примеру туже QAbstractExtensionFactory
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.259 секунд. Запросов: 21.