Greeting
I created plugin with Qt (5.6.2)
and trying to load it but it returns null
all the time. I checked several question and also tried the solutions but it didn't work for me.
Can you take a look of the following code and see whats wrong?
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
}
And this is how i try to load the plugin in my main process.
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;
}
Im using QT 5.6.2 and QT Creator and MinGW 32bit.
EDIT 1: I found the reason but i have no idea why it cause the problem, Im using library that is linked to project but when i use its function, The instance returns null.
LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/MSXFS.lib
INCLUDEPATH += $$(STANDARD_XFS_DIRECTORY)/INCLUDE
I also have no compile or linker error. Can anyone tell me what wrong here?
EDIT 2:
The following configs of library and plugin in CMakeList.txt
work perfectly fine when i make the project with Visual Studio
. (Made with 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}
)
And this is the configs of library and plugin in .pro
file in Qt Creator
with MinGW
which is not working when i use the library.
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})
So i can say the code it self is fine and i'm definitely missing some configs in .pro
file.
PS1: Plugin and the application that load the plugin, Both have INCLUDEPATH
and LIBS
of the library in their pro file.
PS2: The application and the plugin both are in debug mode
PS3: I dont get any compile error or linker error during compile.
EDIT 3:
I made simple console application and included my library header and lib file and called the function and this is the error i get when i run the application. So it must be it. But seriously why!!!
The Code:
LPWFSRESULT result = new WFSRESULT();
WFSFreeResult(result);
PS: The library is from trusted source and it work perfectly with Visual Studio.
Thanks in advance.