Bonjour,
Je travaille sous Ubuntu 20.04 LTS et Qt 5.14.2.
Je m'essaye actuellement aux plugins. J'ai potassé la doc officielle Qt et l'exemple "plug and paint".
Je me suis fait un petit programme pour tester. Le plugin se nomme liboutilsplug.a mais je ne parviens pas à le charger. Le QPluginLoader.errorString() me renvoi "liboutilsplug.a is not an ELF object".

interfaces.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#ifndef INTERFACES_H
#define INTERFACES_H
 
#include <QWidget>
 
class OutilsInterface
{
    public:
        virtual ~OutilsInterface() {}
        virtual void conversion(QWidget *parent) = 0;
};
 
#define OutilsInterface_iid "test01.OutilsInterface"
 
Q_DECLARE_INTERFACE(OutilsInterface, OutilsInterface_iid)
 
#endif // INTERFACES_H
outilsplugin.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
#ifndef OUTILSPLUGIN_H
#define OUTILSPLUGIN_H
 
#include <QObject>
#include <QtPlugin>
#include <QWidget>
 
#include "interfaces.h"
 
class OutilsPlugin : public QObject, OutilsInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "test01.OutilsPlugin" FILE "outilsplugin.json")
    Q_INTERFACES(OutilsInterface)
 
    public:
        void conversion(QWidget *parent) override;
};
 
#endif // OUTILSPLUGIN_H
outilsplugin.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
#include <QMessageBox>
 
#include "outilsplugin.h"
 
void OutilsPlugin::conversion(QWidget *parent)
{
    QMessageBox::information(parent, "ok", "ok pour conversion");
}
Dans l'application mère, je charge le plugin avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
bool FenetrePrincipale::loadPlugin()
{
    QDir pluginsDir(qApp->applicationDirPath());
    qDebug() << qApp->applicationDirPath();
    pluginsDir.cd("../plugins");
    qDebug() << pluginsDir;
    qDebug() << pluginsDir.entryList(QDir::Files);
   foreach (QString fileName, pluginsDir.entryList(QDir::Files))
    {
        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
        if (!pluginLoader.load())
       {
           qWarning("echec load");
        }
        qDebug() << pluginLoader.errorString();
        QObject *plugin = pluginLoader.instance();
        if (plugin)
        {
            outilsInterface = qobject_cast<OutilsInterface *>(plugin);
            if (outilsInterface)
                return true;
        }
    }
 
    return false;
}
Au début je n'avais mis que pluginLoader.instance() car instance() lance automatiquement load() si ce n'est pas déjà fait mais j'ai voulu tester et ça plante au niveau du load(). Le qDebug() me sort "liboutilsplug.a is not an ELF object". Dans les .pro j'ai bien mis les LIB. Quand je teste les chemins avec QDebug(), le plugin liboutilsplug.a est bien au bon endroit. C'est une extension .a donc bien une librairie statique.
Je ne comprend pas ce message d'erreur ? Quelqu'un a t'il une idée ?