首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QPluginLoader实例返回null

QPluginLoader实例返回null
EN

Stack Overflow用户
提问于 2017-12-11 11:42:32
回答 2查看 669关注 0票数 1

问候

我用Qt (5.6.2)创建了插件,并试图加载它,但它总是返回null。我检查了几个问题,也尝试了解决办法,但它对我无效。

你能看看下面的代码,看看出了什么问题吗?

DeviceManager.hpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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文件

代码语言:javascript
复制
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
}

这就是我如何尝试加载插件在我的主要进程。

代码语言:javascript
复制
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使用QT5.6.2和和MinGW 32位。

编辑1:我找到了原因,但我不知道为什么会出现问题,我使用的是链接到项目的库,但是当我使用它的函数时,实例返回null。

代码语言:javascript
复制
LIBS += $$(STANDARD_XFS_DIRECTORY)/LIB/MSXFS.lib
INCLUDEPATH += $$(STANDARD_XFS_DIRECTORY)/INCLUDE

我也没有编译或链接错误。有人能告诉我这里出了什么问题吗?

编辑2:

当我使用CMakeList.txt进行项目时,下面的库和插件在Visual Studio中非常好地工作。(用CMake制作)

代码语言:javascript
复制
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 CreatorMinGW中的库和插件,当我使用这个库时,它不起作用。

代码语言:javascript
复制
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:插件和加载插件的应用程序,它们的pro文件中都有库的INCLUDEPATHLIBS

PS2:应用程序和插件都处于调试模式。

PS3:我在编译过程中没有遇到任何编译错误或链接错误。

编辑3:

我创建了一个简单的控制台应用程序,并包含了我的库头和lib文件,并调用了函数,这就是我在运行应用程序时遇到的错误。所以一定是它。但说真的为什么!

“守则”:

代码语言:javascript
复制
LPWFSRESULT result = new WFSRESULT();
WFSFreeResult(result);

PS:库来自受信任的源,它与Visual完美地工作。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-13 11:20:51

好吧,我觉得这个问题太傻了。我在windows 1032位上运行项目,它工作得很好。也许有些东西与64位不相容,这导致了这场混乱。

感谢大家的所有解决方案,希望您的解决方案能帮助其他人解决问题。

非常感谢!

票数 0
EN

Stack Overflow用户

发布于 2017-12-12 16:02:34

只要正确阅读帖子,有时就能睁开眼睛。

问题是: Qt使用的是minGW,但使用的是lib文件,即用msvc编译器编译的库(visual )。这是不可能的,因为它们通常是不兼容的!

现在您有两个选项:要么为库编译的任何版本的Visual安装Qt,要么,如果库是开源的,则自己使用mingw编译它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47752186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档