qt - 未定义引用`_imp__Z *'

时间:2017-01-09 21:55:29

标签: c++ qt qt-creator

美好的一天

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

我正在各种其他c ++功能中创建共享库,以便完全理解,但我不知所措。

问题:

正如标题所示,错误列表:

我不知道是什么导致了他们,谷歌搜索也没有提供太多的见解。根据建议here添加Q_Object宏,我已经这样做了,但显然没有用。

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

错误:

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'
//...

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

从我所遵循的所有教程等,我没有做任何与众不同的事。

注意:我不确定所需的信息是什么,如果需要更多信息,我很乐意分享。

//。亲

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中定义了构造函数,因为它不存在。

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

因此添加/更改:

// 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(){}

如此处所示,构造函数存在,

还有其他想法吗?

1 个答案:

答案 0 :(得分:3)

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

对于vtable错误,请确保为netm中声明的每个函数(或至少所有虚函数)提供了一个定义(即使为空或已删除)在netm)。类的vtable引用每个虚函数,因此必须定义所有虚函数或不编译它。