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

Приветствие

Я создал плагин с 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

Pro File

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.

РЕДАКТИРОВАТЬ 1: Я нашел причину, но я понятия не имею, почему это вызывает проблему, я использую библиотеку, которая связана с проектом, но когда я использую его функцию, экземпляр возвращает ноль.

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 библиотеки в их профессиональном файле.

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

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

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

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

Код:

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

Ошибки

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам