Экземпляр QPluginLoader возвращает null

Приветствие

Я создал плагин с Qt (5.6.2) и пытаюсь его загрузить, но он все время возвращает null. Я проверил несколько вопросов, а также попробовал решения, но у меня это не сработало.

Можете ли вы взглянуть на следующий код и понять, что не так?

DeviceManager.hpp

#ifndef DEVICE_MANAGER_HPP
#define DEVICE_MANAGER_HPP

#include <QtCore>
#include <string>

using namespace std;

class DeviceManager
{

public:
    virtual ~DeviceManager() {}

    virtual bool initialize() = 0;
    virtual string getBrandName() = 0;

};

QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(DeviceManager, "com.some.address/1.0")
QT_END_NAMESPACE

#endif //DEVICE_MANAGER_HPP

DeviceManagerImpl.hpp

#ifndef DEVICE_MANAGER_IMPL_HPP
#define DEVICE_MANAGER_IMPL_HPP

#include "DeviceManager.hpp"

#include <string>
using namespace std;

class DeviceManagerImpl : public QObject, public DeviceManager
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "com.some.address/1.0")
    Q_INTERFACES(DeviceManager)

public:
    DeviceManagerImpl();

    //Override Method
    bool initialize();          //Have implementation in cpp file
    string getBrandName();      //Have implementation in cpp file

private:
    ...

};

#endif //DEVICE_MANAGER_IMPL_HPP

Профессиональный файл

QT       += core gui sql

TARGET = Device-Manager
#TARGET = $$qtLibraryTarget(Device-Manager)
TEMPLATE = lib
CONFIG += plugin


SOURCES += \
    ...

HEADERS += \
    ...

DISTFILES += Device-Manager.json

unix {
    target.path = /usr/lib
    INSTALLS += target
}

И вот как я пытаюсь загрузить плагин в свой основной процесс.

QPluginLoader * pluginLoader = new QPluginLoader(pluginPath.c_str());
QObject * plugin = pluginLoader->instance();

if (plugin)
{
    deviceManager = qobject_cast<DeviceMAnager *>(plugin);
    return true;
}
else
{
    delete pluginLoader;
    return false;
}

Я использую QT 5.6.2 и QT Creator и MinGW 32bit.

EDIT 1: Я нашел причину, но понятия не имею, почему она вызывает проблему. Я использую библиотеку, связанную с проектом, но когда я использую ее функцию, экземпляр возвращает null.

LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/MSXFS.lib
INCLUDEPATH += $$(STANDARD_XFS_DIRECTORY)/INCLUDE

У меня также нет ошибок компиляции или компоновщика. Кто-нибудь может сказать мне, что здесь не так?

РЕДАКТИРОВАТЬ 2:

Следующие конфигурации библиотеки и плагина в CMakeList.txt прекрасно работают, когда я делаю проект с Visual Studio. (Сделано с помощью CMake)

ADD_DEFINITIONS(${QT_DEFINITIONS})                                                                                      
ADD_DEFINITIONS(-DUNICODE -D_UNICODE)                                                                                       
ADD_DEFINITIONS(-DQT_PLUGIN)                                                                                
ADD_DEFINITIONS(-DQT_SHARED)                                                                                            
ADD_DEFINITIONS(-DQT_DLL)                                                                                           
ADD_DEFINITIONS(-DQT_LARGEFILE_SUPPORT)
ADD_DEFINITIONS(-DQT_THREAD_SUPPORT)

INCLUDE_DIRECTORIES(
    ${STANDARD_XFS_DIRECTORY}/INCLUDE
)

LINK_DIRECTORIES(
    ${STANDARD_XFS_DIRECTORY}
    ${STANDARD_XFS_DIRECTORY}/LIB
)

SET(XFS_LIBS
    MSXFS
    xfs_conf
    SSIDLL
)

TARGET_LINK_LIBRARIES(Device-Manager 
    ${XFS_LIBS}
)

А это конфиги библиотеки и плагина в .pro файле в Qt Creator с MinGW который не работает когда я использую библиотеку.

QT  -= gui
QT  += core sql

TARGET = Device-Manager
TEMPLATE = lib
CONFIG += plugin
CONFIG += c++11

DEFINES += DEVICEMANAGER_LIBRARY

INCLUDEPATH += $$(STANDARD_XFS_DIRECTORY)
INCLUDEPATH += $$(STANDARD_XFS_DIRECTORY)/INCLUDE
message(Include : $${INCLUDEPATH})

LIBS += $$(STANDARD_XFS_DIRECTORY)/SSIDLL.lib
LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/MSXFS.lib
LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/xfs_conf.lib
message(Lib : $${LIBS})

Так что я могу сказать, что код сам по себе в порядке, и мне определенно не хватает некоторых конфигураций в файле .pro.

PS1: Плагин и приложение, которое загружает плагин, оба имеют INCLUDEPATH и LIBS библиотеки в своем файле pro.

PS2: приложение и плагин находятся в режиме отладки.

PS3: я не получаю никаких ошибок компиляции или ошибок компоновщика во время компиляции.

ИЗМЕНИТЬ 3:

Я сделал простое консольное приложение, включил заголовок моей библиотеки и файл lib и вызвал функцию, и это ошибка, которую я получаю при запуске приложения. Так должно быть. А если серьезно, то почему!!!

Код:

LPWFSRESULT result = new WFSRESULT();
WFSFreeResult(result);

Ошибки:

PS: библиотека получена из надежного источника и отлично работает с Visual Studio.

Заранее спасибо.


person M.H.    schedule 11.12.2017    source источник
comment
Любой выходной журнал? Что находится в errorString загрузчика плагинов?   -  person Dmitry Sazonov    schedule 11.12.2017
comment
@DmitrySazonov Не удается загрузить библиотеку ...\Device-Manager.dll: указанный модуль не найден.   -  person M.H.    schedule 11.12.2017
comment
Итак, вы получили ответ?   -  person Dmitry Sazonov    schedule 11.12.2017
comment
@DmitrySazonov Не совсем так! Я искал эту ошибку раньше и не нашел ничего, что соответствовало бы моему случаю, или я что-то упустил!!?? Можете ли вы сказать мне, что вы думаете?   -  person M.H.    schedule 11.12.2017
comment
Я думаю, что нет файла .dll, который вы ищете. Вы уверены, что установили правильный pluginPath?   -  person Dmitry Sazonov    schedule 11.12.2017
comment
@Dmitry Sazonov Да, путь правильный, я в этом уверен.   -  person M.H.    schedule 11.12.2017
comment
Хорошо, теперь попробуйте использовать отладчик. Выполните пошаговую отладку, зайдя в конструктор QPluginLoader и в метод instance.   -  person Dmitry Sazonov    schedule 11.12.2017
comment
@DmitrySazonov Можете ли вы проверить редактирование 1? Спасибо   -  person M.H.    schedule 12.12.2017
comment
Что я должен проверить? Еще раз: выполните пошаговую отладку с переходом в конструктор QPluginLoader и в метод instance.   -  person Dmitry Sazonov    schedule 12.12.2017
comment
Связана ли эта библиотека с плагином или проектом, который загружает плагин?   -  person Felix    schedule 12.12.2017
comment
@Felix На самом деле обоим.   -  person M.H.    schedule 12.12.2017
comment
@Felix Я добавил Edit 2 с дополнительной информацией о проблеме.   -  person M.H.    schedule 12.12.2017
comment
это очень странно... возможно, попробуйте этот синтаксис для всех ваших библиотек: LIBS += -L$$(STANDARD_XFS_DIRECTORY)/LIB/ -lMSXFS. Это стандартный способ добавления библиотек, возможно, это связано с проблемой...   -  person Felix    schedule 12.12.2017
comment
@Felix Я также внес следующее изменение в LIBS и до сих пор не могу решить проблему. win32:LIBS += $$(STANDARD_XFS_DIRECTORY)/SSIDLL.lib win32:LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/MSXFS.lib win32:LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/xfs_conf.lib unix:LIBS + = -L/$$(STANDARD_XFS_DIRECTORY) -lSSIDLL unix:LIBS += -L/$$(STANDARD_XFS_DIRECTORY)/LIB -lMSXFS unix:LIBS += -L/$$(STANDARD_XFS_DIRECTORY)/LIB -lxfs_conf   -  person M.H.    schedule 12.12.2017
comment
@Felix LIBS += -L$$(STANDARD_XFS_DIRECTORY)/LIB/ -lMSXFS не устранила проблему, кстати.   -  person M.H.    schedule 12.12.2017


Ответы (2)


Просто правильное чтение постов иногда может открыть глаза.

Проблема в том, что вы используете minGW с Qt, но используете lib-файл, то есть библиотеку, скомпилированную компилятором msvc (visual studio). Это невозможно, так как они вообще несовместимы!

Теперь у вас есть 2 варианта: либо вы устанавливаете Qt Kit для той версии Visual Studio, для которой была скомпилирована библиотека, либо, если библиотека с открытым исходным кодом, скомпилируете ее самостоятельно с помощью mingw.

person Felix    schedule 12.12.2017

Ну, я нашел проблему, но она такая глупая. Я запускаю проект на Windows 10 32 бит, и он работает нормально. Может быть, что-то несовместимо с 64-битной системой, что и вызвало этот бардак.

Спасибо всем за все ваши решения, и я надеюсь, что ваши решения помогут другим проблемам.

Большое спасибо!

person M.H.    schedule 13.12.2017