LINUX.ORG.RU

[Qt4] Динамическое подключение дополнительных lib


0

0

До текущего дня не приходилось юзать динамическое подключение в Linux. Собственно поэтому прошу местных гуру помочь советом/примером.

Цель есть Qt4 приложение, в котором надо сделать расширяемость, т.е. расширение функциональной части за счет дополнительных библиотек (плагинов). Пусть есть какой-то API. Очень хотелось бы узнать как такое реализуется.


У qmmp плагинная система есть.

JackYF ★★★★
()

Вот тебе пример:

1. Интерфейс плагина

// plugininterface.h
#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H

#include <QtGlobal>

class PluginInterface
{
public:
virtual void someAction () = 0;
};

Q_DECLARE_INTERFACE(PluginInterface, "Some interface");

#endif // PLUGININTERFACE_H
-------------------------------------------------------

2. Собственно плагин (отдельный проект)

// plugin.h
#ifndef PLUGIN_H
#define PLUGIN_H

#include <QObject>
#include "plugininterface.h" // не забудь настроить пути

class Plugin: public QObject, PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)

public:
void someAction ();
};

#endif // PLUGIN_H

// plugin.cpp
#include <QtPlugin>
#include "plugin.h"

void Plugin::someAction ()
{
// реализация...
}

// первый параметр желательно = TARGET в файле проекта
Q_EXPORT_PLUGIN2(plugin, Plugin);
-------------------------------------------------------

3. Программа, использующая плагин (отдельный проект)

// main.cpp
#include <QCoreApplication>
#include <QPluginLoader>
#include <QTextStream>
#include "plugininterface.h"

PluginInterface* loadPlugin (const QString &file)
{
QPluginLoader loader;
PluginInterface *plugin = 0;

loader.setFileName(file);
if (loader.load())
{
plugin = qobject_cast<PluginInterface*>(loader.instance());
if (!plugin) loader.unload(); // не наш плагин
}

return plugin;
}

static QTextStream cerr(stderr);

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

PluginInterface *plugin = loadPlugin("libplugin.so");
if (!plugin)
{
cerr << "Couldn't load plugin" << endl;
return 1;
}
plugin->someAction();

return 0;
}
-------------------------------------------------------

При сборке не забудь, что в проекте с реализацией плагина (.pro файл) нужно указать "TEMPLATE = lib".

mannaz
()

Судя по всему, вам не библиотеки динамические нужны, а скрипты. В Qt для такого придумали QtScript.

Conficker
()
Ответ на: комментарий от mannaz

> Вот тебе пример:

Спасибо большое, это то что доктор прописал. Сам потихоньку дошел до подобной реализации, но пара пробелов была. Теперь все стало на свои места.

irq
() автор топика
Ответ на: комментарий от irq

Да, это все в примерах и документации есть. Почитай еще рекомендации троллей по поводу бинарной совместимости - там есть некоторые тонкости. Это чтобы не нужно было перекомпилировать основную программу всякий раз, когда ты сделал новую версию плагина с новыми фичами.

mannaz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.