Приветствие
Я создал плагин с 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.
Заранее спасибо.
errorString
загрузчика плагинов? - person Dmitry Sazonov   schedule 11.12.2017pluginPath
? - person Dmitry Sazonov   schedule 11.12.2017QPluginLoader
и в методinstance
. - person Dmitry Sazonov   schedule 11.12.2017QPluginLoader
и в методinstance
. - person Dmitry Sazonov   schedule 12.12.2017LIBS += -L$$(STANDARD_XFS_DIRECTORY)/LIB/ -lMSXFS
. Это стандартный способ добавления библиотек, возможно, это связано с проблемой... - person Felix   schedule 12.12.2017