1

问候

我创建了插件Qt (5.6.2)并尝试加载它,但它一直返回null。我检查了几个问题并尝试了解决方案,但它对我不起作用。

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

设备管理器.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 32 位。

编辑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文件中缺少一些配置。

INCLUDEPATHPS1:插件和加载插件的应用程序,它们的 pro 文件中都有LIBS库。

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

PS3:我在编译期间没有收到任何编译错误或链接器错误。

编辑 3:

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

编码:

LPWFSRESULT result = new WFSRESULT();
WFSFreeResult(result);

错误:

PS:该库来自受信任的来源,并且可以与 Visual Studio 完美配合。

提前致谢。

4

2 回答 2

2

只是正确地阅读帖子有时可以睁大眼睛。

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

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

于 2017-12-12T16:02:34.660 回答
0

好吧,我发现了这个问题,但是它太愚蠢了。我在 windows 10 32 位上运行项目,它工作正常。也许某些东西与 64 位不兼容,导致了这种混乱。

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

非常感谢!

于 2017-12-13T11:20:51.487 回答