C++ 在qlibrary的dll中编译qobject时出错

C++ 在qlibrary的dll中编译qobject时出错,c++,qt,dll,qmake,C++,Qt,Dll,Qmake,我编写了一些内核来动态加载*.dll文件。作为主要工具,我使用Qt5.12企业版。此dll必须通过QLibrary下载其他qobject继承类,以便在核心程序中连接和使用,并通过信号/插槽连接。但在编译dll时,该dll将通过qlibrary下载,我收到一条错误消息“vtable的未定义引用,驱动程序接口”,我看到了关于堆栈溢出的相同问题,但其中的解决方案是尝试清理和重建项目,对我来说不起作用。也许我应该包括其他moc文件,但哪一个?我使用qmake作为构建系统。所有纯虚方法都在继承类中重新定义

我编写了一些内核来动态加载*.dll文件。作为主要工具,我使用Qt5.12企业版。此dll必须通过QLibrary下载其他qobject继承类,以便在核心程序中连接和使用,并通过信号/插槽连接。但在编译dll时,该dll将通过qlibrary下载,我收到一条错误消息“vtable的未定义引用,驱动程序接口”,我看到了关于堆栈溢出的相同问题,但其中的解决方案是尝试清理和重建项目,对我来说不起作用。也许我应该包括其他moc文件,但哪一个?我使用qmake作为构建系统。所有纯虚方法都在继承类中重新定义。清单如下

#ifndef DRIVER101104_H
#define DRIVER101104_H

#include "driver101-104_global.h"
#include "driverinterface.h"
#include "protocol101104wrapper.h"
#include <QObject>
#include <functional>
#include <QHash>

class Driver101104 : public DriverInterface
{
    Q_OBJECT
public:
    Driver101104();
    virtual ~Driver101104();
    // DriverInterface interface
public:
    void setMessageAsString(const QString &_message);
    QString getMessageAsString();
    void initializeChannel(const QJsonObject& _parameters);
    bool downloadTagsModel(const QHash<QString, std::shared_ptr<TagModel> > &_tagModels);
    void setCallBackFunction(const QString &_nameOfCallBack, std::function<void (const QString &)> _callback);
private:
    protocol101104Wrapper wrapper;
};

extern "C"{
    DRIVER101104SHARED_EXPORT DriverInterface* createDriverClass(){
        return new Driver101104();
    }
}

#endif // DRIVER101104_H

#include "driver101104.h"

Driver101104::Driver101104():DriverInterface()
{
}

Driver101104::~Driver101104()
{

}

void Driver101104::setMessageAsString(const QString &_message)
{

}

QString Driver101104::getMessageAsString()
{

}

/**
 * @brief Driver101104::initializeChannel
 * @param _parameters
 */
void Driver101104::initializeChannel(const QJsonObject& _parameters)
{
   wrapper.channelInitializer(_parameters);
}


/**
 * @brief Driver101104::downloadTagsModel
 * Here should be something that return code
 * of error for this program
 * @param _tagModels
 * @return
 */

bool Driver101104::downloadTagsModel(const QHash<QString, std::shared_ptr<TagModel> >& _tagModels)
{
    return true;
}

void Driver101104::setCallBackFunction(const QString &_nameOfFunction, std::function<void (const QString&)> _callback)
{
    wrapper.setCallBackFunction(_nameOfFunction,_callback);
}
#包括“driver101104.h”
Driver101104::Driver101104():DriverInterface()
{
}
Driver101104::~Driver101104()
{
}
void driver10104::setMessageAsString(const QString&_message)
{
}
QString驱动器101104::getMessageAsString()
{
}
/**
*@brief Driver101104::初始化通道
*@param\u参数
*/
void driver10104::initializeChannel(const QJsonObject和\u参数)
{
包装器.channelInitializer(_参数);
}
/**
*@brief driver10104::downloadTagsModel
*这里应该有一些返回代码的东西
*此程序的错误类型
*@param\u tagModels
*@返回
*/
bool driver10104::下载标记模型(const-QHash和\u-tagModels)
{
返回true;
}
void driver10104::setCallBackFunction(常量QString和函数名,std::函数回调)
{
setCallBackFunction(_nameoff函数,_callback);
}

我找到了这个问题的答案,我重写了driverInterface和driver01104的类,在它之后,所有的内容都是正确的。已加载库并正常工作。只有与信号和插槽的连接不起作用

    #ifndef DRIVER101104_H
#define DRIVER101104_H

#include <QObject>
#include <functional>
#include <QHash>
#include "driver101-104_global.h"
#include "protocol101104wrapper.h"
#include "driverinterface.h"

class DRIVER101104SHARED_EXPORT Driver101104 : public DriverInterface
{
    Q_OBJECT
public:
    Driver101104(QObject* parent = nullptr);
    virtual ~Driver101104();

public:
    void initializeChannel(const QJsonObject &_parameters);
    void setCallBackFunction(const QString &_nameOfCallBack,
                             std::function<void (const QString &)> _callback);
    bool downloadTagsModel(const QHash<QString,
                           std::shared_ptr<TagModel> > &_tagModels);
    void setMessageAsString(const QString &_message);
    QString getMessageAsString();


private:
    protocol101104Wrapper* wrapper;
};

extern "C"{
    DRIVER101104SHARED_EXPORT DriverInterface* createDriverClass();
}

#endif // DRIVER101104_H



#ifndef DRIVERINTERFACE_H
#define DRIVERINTERFACE_H

#include <QObject>
#include <functional>
#include <QString>
#include <memory>
#include <QHash>
#include <QJsonObject>

class TagModel;

class DriverInterface : public QObject
{
    Q_OBJECT
public:

    DriverInterface(QObject* parent = nullptr): QObject(parent){

    }

    virtual ~DriverInterface(){

    }

    virtual void setMessageAsString(const QString& _message) = 0;
    virtual void initializeChannel(const QJsonObject& _parameters) = 0;
    virtual void setCallBackFunction(const QString &_nameOfCallBack,
                             std::function<void (const QString &)> _callback) = 0;
    virtual bool downloadTagsModel(const QHash<QString,
                           std::shared_ptr<TagModel> >& _tagModels) = 0;
    virtual QString getMessageAsString() = 0;

signals:
    void callBackMessage(QJsonObject _message);

};

#endif // DRIVERINTERFACE_H
#如果NDEF驱动器101104_H
#定义驱动器101104_H
#包括
#包括
#包括
#包括“driver101-104_global.h”
#包括“protocol101104wrapper.h”
#包括“driverinterface.h”
类Driver10104共享\u导出Driver101104:公共DriverInterface
{
Q_对象
公众:
驱动器101104(QObject*parent=nullptr);
虚拟驱动器101104();
公众:
void initializeChannel(const QJsonObject和_参数);
void setcallback函数(常量QString和\u callback的名称,
std::函数_回调);
bool下载tagsmodel(const-QHash和\u-tagModels);
void setMessageAsString(const QString&_message);
QString getMessageAsString();
私人:
协议101104包装器*包装器;
};
外部“C”{
Driver10104共享_导出DriverInterface*createDriverClass();
}
#endif//DRIVER101104_H
#ifndef驱动器接口
#定义驱动器接口
#包括
#包括
#包括
#包括
#包括
#包括
类标记模型;
类DriverInterface:公共QObject
{
Q_对象
公众:
DriverInterface(QObject*parent=nullptr):QObject(parent){
}
虚拟~DriverInterface(){
}
虚空setMessageAsString(常量QString&_message)=0;
虚空初始化通道(常量QJsonObject&_参数)=0;
虚拟void setCallBackFunction(常量QString和\u callback的名称,
std::函数_callback)=0;
虚拟bool-downloadTagsModel(const-QHash&_-tagModels)=0;
虚拟QString getMessageAsString()=0;
信号:
无效回调消息(QJsonObject_消息);
};
#endif//drivernterface\u H

大家好,欢迎来到stackoverflow。请看一看这篇文章,因为你的文章似乎很长,可能没有必要在其中包含这么多代码:你好,有趣的艺术,但无论如何,我所写的都是理解这个问题所必需的。解决这个问题不是小事,如果是的话我会自己解决的。请纠正你的问题,目前很难理解。请提供所有需要的代码,并用文件名进行标记,当编译时会产生与您请求帮助相同的错误。目前,您的project.pro提到了您没有提供的文件,在“driver101104.h”中,您包括了“driver101-104_global.h”和“protocol101104wrapper.h”,您也没有提供。因此,我无法重现您的编译问题,因为编译器会产生许多其他错误。
#include "driver101104.h"

Driver101104::Driver101104():DriverInterface()
{
}

Driver101104::~Driver101104()
{

}

void Driver101104::setMessageAsString(const QString &_message)
{

}

QString Driver101104::getMessageAsString()
{

}

/**
 * @brief Driver101104::initializeChannel
 * @param _parameters
 */
void Driver101104::initializeChannel(const QJsonObject& _parameters)
{
   wrapper.channelInitializer(_parameters);
}


/**
 * @brief Driver101104::downloadTagsModel
 * Here should be something that return code
 * of error for this program
 * @param _tagModels
 * @return
 */

bool Driver101104::downloadTagsModel(const QHash<QString, std::shared_ptr<TagModel> >& _tagModels)
{
    return true;
}

void Driver101104::setCallBackFunction(const QString &_nameOfFunction, std::function<void (const QString&)> _callback)
{
    wrapper.setCallBackFunction(_nameOfFunction,_callback);
}
    #ifndef DRIVER101104_H
#define DRIVER101104_H

#include <QObject>
#include <functional>
#include <QHash>
#include "driver101-104_global.h"
#include "protocol101104wrapper.h"
#include "driverinterface.h"

class DRIVER101104SHARED_EXPORT Driver101104 : public DriverInterface
{
    Q_OBJECT
public:
    Driver101104(QObject* parent = nullptr);
    virtual ~Driver101104();

public:
    void initializeChannel(const QJsonObject &_parameters);
    void setCallBackFunction(const QString &_nameOfCallBack,
                             std::function<void (const QString &)> _callback);
    bool downloadTagsModel(const QHash<QString,
                           std::shared_ptr<TagModel> > &_tagModels);
    void setMessageAsString(const QString &_message);
    QString getMessageAsString();


private:
    protocol101104Wrapper* wrapper;
};

extern "C"{
    DRIVER101104SHARED_EXPORT DriverInterface* createDriverClass();
}

#endif // DRIVER101104_H



#ifndef DRIVERINTERFACE_H
#define DRIVERINTERFACE_H

#include <QObject>
#include <functional>
#include <QString>
#include <memory>
#include <QHash>
#include <QJsonObject>

class TagModel;

class DriverInterface : public QObject
{
    Q_OBJECT
public:

    DriverInterface(QObject* parent = nullptr): QObject(parent){

    }

    virtual ~DriverInterface(){

    }

    virtual void setMessageAsString(const QString& _message) = 0;
    virtual void initializeChannel(const QJsonObject& _parameters) = 0;
    virtual void setCallBackFunction(const QString &_nameOfCallBack,
                             std::function<void (const QString &)> _callback) = 0;
    virtual bool downloadTagsModel(const QHash<QString,
                           std::shared_ptr<TagModel> >& _tagModels) = 0;
    virtual QString getMessageAsString() = 0;

signals:
    void callBackMessage(QJsonObject _message);

};

#endif // DRIVERINTERFACE_H