Ошибка загрузки подключаемого модуля Qt (не удалось найти указанный модуль) - PullRequest
0 голосов
/ 26 мая 2020

По какой-то причине я больше не могу загружать свои плагины, хотя раньше это работало. У меня есть код загрузчика плагинов в моем MainWindow, который должен загружать все .dll, найденные в указанной папке c. Код MainWindow содержит следующее:

Интерфейс

#ifndef PLUGININTERFACE_H
#define PLUGININTERFACE_H

#include <QtPlugin>

// forward declarations
class MainWindow;
struct P3DData;

class PluginInterface
{
public:
    virtual bool createPublisher(MainWindow*, P3DData*) = 0;
};

#define PLUGIN_INTERFACE_iid "PluginInterface"
Q_DECLARE_INTERFACE(PluginInterface, PLUGIN_INTERFACE_iid)

#endif // PLUGININTERFACE_H

loadPlugins ()

bool MainWindow::loadPlugins()
{
    QDir pluginsDir(qApp->applicationDirPath());
    pluginsDir.cd("plugins");

    const auto entryList = pluginsDir.entryList(QDir::Files);
    for(const QString &fileName : entryList)
    {
        QString dllPath = pluginsDir.absoluteFilePath(fileName);
        QPluginLoader* loader = new QPluginLoader(dllPath);
        loaderList.push_back(loader);     
        QObject *plugin = loader->instance();

        if (plugin)
        {
            pluginList.push_back(qobject_cast<PluginInterface *>(plugin));
            pluginList.last()->createPublisher(this, simDataPtr);
            pluginCount++;
            continue;
        }
        else
        {
            qDebug() << "[PluginLoader] '" + fileName + "': " + loader->errorString();
            delete loaderList.takeLast();
        }
    }
}

Помимо моего MainWindow, в моем проекте есть еще один подкаталог, который является плагин «Позиция». Плагин развертывается в правильную папку «plugins», которую выполняет метод loadPlugin () из MainWindow. Плагин использует следующий код для реализации интерфейса:

#include <QObject>
#include "MainWindow.h"

class PositionPublisher : public QObject, PluginInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "PluginInterface")
    Q_INTERFACES(PluginInterface)

public:
    PositionPublisher();
    ~PositionPublisher();
    bool createPublisher(MainWindow* _window, P3DData* _simDataPtr) override;

//...
};

При попытке запустить loadPlugins () сейчас он проверяет правильный файл Position.dll, но часть «if (plugin)» возвращает false и loader- > errorString () выполняется со следующей ошибкой:

[PluginLoader] 'Position.dll': не удается загрузить библиотеку F: \ DEV \ build \ simNET \ bin \ plugins \ Position.dll: Не удается найти указанный модуль .

Я уже проверял и пробовал следующее:

  • папка Plugins на самом деле содержит файл Position.dll
  • оба проекта (MainWindow и Plugin) построены в режиме выпуска
  • существуют зависимости плагина (две библиотеки) и указанный путь в pro файл правильный

.pro файл плагина:

QT += widgets

TEMPLATE = lib
CONFIG += c++11
CONFIG += plugin
CONFIG += release

SOURCES += \
    Position.cpp \
    PositionPubSubTypes.cpp \
    PositionPublisher.cpp

HEADERS += \
    Position.h \
    PositionPubSubTypes.h \
    PositionPublisher.h

DISTFILES += \
    Position.idl

INCLUDEPATH += ../../application
TARGET          = $$qtLibraryTarget(Position)
DESTDIR         = ../../bin/plugins

INCLUDEPATH += "F:/DEV/prog/FastRTPSv1.5/include"
DEPENDPATH += "F:/DEV/prog/FastRTPSv1.5/include"
LIBS += -L"F:/DEV/prog/FastRTPSv1.5/lib/x64Win64VS2015" -lfastrtps-1.5
PRE_TARGETDEPS += F:/DEV/prog/FastRTPSv1.5/lib/x64Win64VS2015/fastrtps-1.5.lib

INCLUDEPATH += 'F:/Programme/Prepar3D v4/SDK/inc/SimConnect'
DEPENDPATH += 'F:/Programme/Prepar3D v4/SDK/inc/SimConnect'
LIBS += -L'F:/Programme/Prepar3D v4/SDK/lib/SimConnect' -lSimConnect
PRE_TARGETDEPS += 'F:/Programme/Prepar3D v4/SDK/lib/SimConnect/SimConnect.lib'

Кто-нибудь знает, почему он не загружает плагин ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...