QT Static Plugin

In das .pro file des statischen plugins muss folgendes rein:

project.pro
TEMPLATE = lib TARGET = example-plugin CONFIG += static plugin release c++17 no_keywords

Die Klassendefinition erfolgt genau gleich wie bei einem shared lib plugin:

class ExamplePlugin : public QObject, PluginInterface
{
        Q_OBJECT
        Q_PLUGIN_METADATA(IID "hb9hei.example.plugin" FILE "resources/plugin-metadata.json")
        Q_INTERFACES(PluginInterface)
public:
        explicit ExamplePlugin();
        ~ExamplePlugin();
	...
}

In das Projekt welches das statische plugin verwendet muss folgendes ins .pro file:

project.pro
LIBS += -Lbuild/static-plugins -lexample-plugin

Bei der Klassenedfinition muss genau wie beim shared lib plugin folgendes ins .h

QT_FORWARD_DECLARE_CLASS(PluginInterface)

In der Datei, welche das Plugin verwendet, muss jenes hin:

Q_IMPORT_PLUGIN(ExamplePlugin)

Wichtig ist dabei, den Namen der Klasse (welche das plugin implementiert) zu verwenden, und NICHT den Dateinamen der Library.

Laden kann man solch ein statisches plugin dann so:

PluginInterface* PluginManager::load_static_stub()
{
	QVector<QStaticPlugin> static_plugins = QPluginLoader::staticPlugins();
	QVector<QStaticPlugin>::const_iterator itr;
	for (itr = static_plugins.constBegin(); itr != static_plugins.constEnd(); ++itr) {
		QStaticPlugin plug = *itr;
		qDebug() << plug.metaData().value("IID").toString();
		if (plug.metaData().value("IID").toString() == "hb9hei.example.plugin") {
			qDebug() << "loading static catdev stub";
			PluginInterface* catdev = qobject_cast<PluginInterface*>(plug.instance());
			if (catdev) {
				qDebug() << "cast successful";
				return catdev;
			}
			return nullptr;
		}
	}
	qDebug() << "----- end of list -----";
	return nullptr;
}