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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Qt и плагины (undefined symbol)  (Прочитано 21476 раз)
zodiac
Гость
« Ответ #15 : Февраль 27, 2008, 12:52 »

Сделал вот так:
test_plugin.h:
Код:
#include <QtCore>
#include "../pluginInterface.h"

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

public:
QString getAuthor()
{
return "zodiac";
}
};
test_plugin.cpp:
Код:
#include "test_plugin.h"
Q_EXPORT_PLUGIN2(testplugin, testPlugin);

Перекомпилировал все. Теперь пишет: "Unknown error"
Записан
Вячеслав
Гость
« Ответ #16 : Февраль 27, 2008, 13:11 »

strace натрави ..... strace твоя_программа
А вообще - давай полные исходники проекта - посмотрим
Записан
zodiac
Гость
« Ответ #17 : Февраль 27, 2008, 13:14 »

Щас echoplugin взял из ассистента. Все сделал как написано, в итоге:
Цитировать
zodiac@zodiac ~/Desktop/echoplugin/echowindow $ ./echowindow
ASSERT: "!isEmpty()" in file /usr/include/qt4/QtCore/qlist.h, line 242
Аварийный останов
zodiac@zodiac ~/Desktop/echoplugin/echowindow $
Записан
zodiac
Гость
« Ответ #18 : Февраль 27, 2008, 13:31 »

Разобрался с ошибкой echo, теперь также пишет: "Unknown error".
Записан
Вячеслав
Гость
« Ответ #19 : Февраль 27, 2008, 13:40 »

............................................... сказал боцман и начал грязно ругаться ...
Ну дерни ты свою прогу через strace - оно тебе скаже че ему надо
Записан
zodiac
Гость
« Ответ #20 : Февраль 27, 2008, 13:47 »

дак а я не знаю чего там смотреть-то.
Записан
Вячеслав
Гость
« Ответ #21 : Февраль 27, 2008, 13:55 »

ткни в командной строке strace ТвойПрог >out
а далее в out глазками поищи где оно рушиться ....
ЗЫ Ну кинь ты полные исходники своего проекта - легче будет ....
Записан
zodiac
Гость
« Ответ #22 : Февраль 27, 2008, 14:18 »

А исходники EchoPlugin из ассистента) Там тоже такая же ошибка.
А у тебя нет простого проекта, который юзает плагины? Как бы шаблон просто.
Записан
Вячеслав
Гость
« Ответ #23 : Февраль 27, 2008, 14:29 »

Гы Подмигивающий я с plug&paint'a все содрал Подмигивающий Щаз простых проектов уже не найти Грустный
Таки чем p&p В качестве простого примера не подходит ?
Записан
zodiac
Гость
« Ответ #24 : Февраль 27, 2008, 14:46 »

Все, что имеется сейчас:
/cryptMain.cpp:
Код:
#include "cryptMain.h"
#include "pluginInterface.h"
#include <QtGui>
#include <QMessageBox>

cryptMain::cryptMain(QWidget *parent) : QMainWindow(parent)
{
setupUi(this);

pluginsDir = QDir(qApp->applicationDirPath());

pluginsDir.cd("plugins");

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

/*if (loader.isLoaded())
{
pluginInterface *plg = qobject_cast<pluginInterface *>(plugin);
QMessageBox::information(0, "!!!", plg->getAuthor());
}*/

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

/*QPluginLoader loader("plugins/libtest_plugin.so");

if (!loader.load())
{
QMessageBox::information(0, "!!!", loader.errorString());
}*/
}
/cryptMain.h:
Код:
#include <QPluginLoader>
#include <QMessageBox>
#include <QDir>
#include "ui_cryptMain.h"

class cryptMain : public QMainWindow, private Ui::cryptMain
{
    Q_OBJECT

public:
    cryptMain(QWidget *parent = 0);

private slots:

private:
QObject *plugin;

//QPluginLoader loader;

QDir pluginsDir;

QString pluginFileName;
};
/cryptMain.ui:
формочка:)
/main.cpp:
Код:
#include <QApplication>
#include "pluginInterface.h"
#include "cryptMain.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    cryptMain form;
    form.show();

    return app.exec();
}
/main.pro:
Код:
######################################################################
# Automatically generated by qmake (2.01a) Thu Feb 21 18:17:20 2008
######################################################################

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += cryptMain.h
FORMS += cryptMain.ui
SOURCES += cryptMain.cpp main.cpp
/pluginInterface.h:
Код:
#include <QObject>
#include <QtCore>
#include <QString>

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

Q_DECLARE_INTERFACE (pluginInterface, "zodiac.pluginInterface/1.0")
/main/plugins/plugins.pro:
Код:
######################################################################
# Automatically generated by qmake (2.01a) Wed Feb 27 14:45:38 2008
######################################################################

TEMPLATE = lib
CONFIG += plugin
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += test_plugin.h ../pluginInterface.h
SOURCES += test_plugin.cpp
/main/plugins/test_plugin.cpp:
Код:
#include "test_plugin.h"
Q_EXPORT_PLUGIN2(testplugin, testPlugin);
/main/plugins/test_plugin.h:
Код:
#include <QtCore>
#include "../pluginInterface.h"

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

public:
QString getAuthor()
{
return "zodiac";
}
};
Записан
Вячеслав
Гость
« Ответ #25 : Февраль 27, 2008, 14:59 »

типа эта плагин - твой
загрузчик мой
Код:
#include "pluginInterface.h "

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPluginLoader loader("plugins/debug/testd.dll");
QObject *plugin = loader.instance();
if(plugin)
{
pluginInterface *plg = qobject_cast<pluginInterface *>(plugin);
if(plg)
QMessageBox::information(0, "!!!", plg->getAuthor());
else
QMessageBox::information(0, "error", "qobject_cast fail");
}
else
QMessageBox::information(0, "error", loader.errorString ());

return 0;
Работает однако Подмигивающий

pS и в форточках и под Дебианом Подмигивающий .....
Записан
zodiac
Гость
« Ответ #26 : Февраль 27, 2008, 15:18 »

Ого! Работает:) Спасибо.
Записан
Вячеслав
Гость
« Ответ #27 : Февраль 27, 2008, 15:32 »

 Смеющийся Смеющийся Смеющийся Удачи Подмигивающий
Записан
zodiac
Гость
« Ответ #28 : Февраль 28, 2008, 12:51 »

А если использовать этот загрузчик несколько раз, то старый плагин обязательно как-либо выгружать?
Записан
Вячеслав
Гость
« Ответ #29 : Февраль 28, 2008, 13:29 »

А нафига ? Плагин выгружаеться когда убиваеться последняя ссылка на то,что вернул instance()...
В том-же p&p они тупо в цикле грузят одним лоадером пачку плагинов ....
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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