Экземпляр 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.