qt - 对“_imp__Z*”的未定义引用

qt - undefined reference to `_imp__Z*'

大家好

请注意:这里是C++新手

我正在创建各种其他 c++ 功能之间的共享库以允许完整的理解,但是我不知所措。

问题:

如题所示,错误列表:

我不知道是什么原因造成的,谷歌搜索也没有提供太多见解。按照here的建议添加Q_Object宏,我已经这样做了,但显然没有用。

各种其他 SO 帖子建议检查正确的 header,等等,这是正确的。

错误:

netm.cpp:3: error: undefined reference to `vtable for netm'
netm.cpp:3: error: undefined reference to `_imp___ZN4miscC1Ev'

netm.cpp:6: error: undefined reference to `vtable for netm'
netm.cpp:6: error: undefined reference to `_imp___ZN4miscC1Ev'
//...

我还有几个与上述类似的错误,但解决这些错误应该有助于我解决其余部分

从我遵循的所有教程等来看,我没有做任何异常的事情。

注意:我不确定需要哪些信息,如果需要更多信息,我很乐意分享。

//.pro

QT       -= gui
QT       += network

TARGET = netm
TEMPLATE = lib

DEFINES += NETM_LIBRARY

SOURCES += netm.cpp

HEADERS += netm.h\
        netm_global.h

unix {
    target.path = /usr/lib
    INSTALLS += target
}

//netm_global.h - 全

#ifndef NETM_GLOBAL_H
#define NETM_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(NETM_LIBRARY)
#  define NETMSHARED_EXPORT Q_DECL_EXPORT
#else
#  define NETMSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // NETM_GLOBAL_H

//netm.h - 全

#ifndef NETM_H
#define NETM_H

#include "netm_global.h"
#include "../misc/misc.h"
#include "../gen/gen.h"

#include <QHostInfo>
#include <QTcpSocket>

class NETMSHARED_EXPORT netm
{
    Q_OBJECT

public:
    netm();
    netm(QString hostname);
    bool Send(int portNumber, char* message = NULL);
    ReturnObject read();

    bool isServerOnline(QString IP = QString());
    int getPing(QString IP = QString());
    void getIP();
    void disconnectFromServer();
    ~netm();

private slots:
    void getIP();

private:
    misc m;
    QHostInfo serverInfo;
    QHostAddress serverIP;
    QTcpSocket tcp_con;

};

#endif // NETM_H

//netm.cpp - 部分

#include "netm.h"

netm::netm(){                                    <--- ERROR line
}

netm::netm(QString hostname)                     <--- ERROR line
{
    serverInfo.lookupHost(hostname, 0, SLOT(getIP()));
}

//...

非常感谢帮助(带解释)!

更新

按照建议,我在 misc.cpp 中定义了构造函数,因为它不存在。

重新编译,我读到一个错误,提到 netm class 需要从 QObject 继承。

因此adding/changing:

//netm.h - 部分

#include //...
#include <QObject>

class NETMSHARED_EXPORT netm : public QObject
{
    Q_OBJECT

public:
    netm();
    netm(QString hostname);
    //...
};

错误仍然存​​在:

netm.cpp:3: error: undefined reference to `_imp___ZN4miscC1Ev'
netm.cpp:3: error: undefined reference to `_imp___ZN4miscD1Ev'
netm.cpp:6: error: undefined reference to `_imp___ZN4miscC1Ev'
netm.cpp:6: error: undefined reference to `_imp___ZN4miscD1Ev'

为了完整起见(misc也是一个动态库):

//misc.h

#ifndef MISC_H
#define MISC_H

#include "misc_global.h"

#include <QString>
#include <QList>


class MISCSHARED_EXPORT misc
{
public:

    misc();
    ~misc();

    //String Literals
    //Network related
    static QString googleDNS;

    //Command Codes
    static QString CMD_AUTH;
    static QString CMD_REQ;

    //Request Codes
    static QString REQ_USER_INFO;
    static QString REQ_VPN_DATA;
    static QString REQ_VPN_UP;

    //...
};

//misc.cpp

#include "misc.h"

misc::misc(){
    //Network related
    QString googleDNS = QStringLiteral("8.8.8.8");

    //Command Codes
    QString CMD_AUTH = QStringLiteral("AUTH");
    QString CMD_REQ = QStringLiteral("REQ");

    //Request Codes
    QString REQ_USER_INFO = QStringLiteral("USER_INFO");
    QString REQ_VPN_DATA = QStringLiteral("VPN_DATA");
    QString REQ_VPN_UP = QStringLiteral("VPN_UP");
}

misc::~misc(){}

如这里所见,构造函数存在,

还有其他想法吗?

缺少对 _imp___ZN4miscC1Ev 的调用,根据 c++filtmisc::misc(),可能意味着 class misc 缺少已定义的默认构造函数。检查以确保您正在编译 misc::misc().

的定义

对于 vtable 错误,请确保您已经为 netm 中声明的每个函数(或至少所有虚函数)提供了定义(即使是空的或被删除的)在 netm)。 class 的 vtable 引用每个虚函数,因此必须定义所有虚函数,否则将无法编译。