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.
Well, I found the problem however its so silly. I run project over windows 10 32 bit and it work fine. Maybe something is not incompatible with 64 bit and that caused this mess.
Thanks everyone for all your solution and i hope your solutions help others problem.
Thanks alot!