qt — неопределенная ссылка на `_imp__Z * ‘

Всем доброго времени суток

Пожалуйста, обратите внимание: C ++ новичок здесь

Я создаю общие библиотеки среди различных других функций C ++, чтобы обеспечить полное понимание, однако я в растерянности.

Проблема:

Как следует из названия, список ошибок:

Я понятия не имею, что их вызывает, и поиск в Google не дает много понимания. Как предложено Вот добавить 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'
//...

У меня есть еще несколько ошибок, подобных этим выше, но их решение должно помочь мне в решении остальных

Из всех уроков и т. Д., Которые я изучил, я не сделал ничего необычного.

Замечания: Я не уверен, какая информация все требуется, если потребуется больше, я с удовольствием поделюсь.

//.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 класс, необходимый для наследования от QObject.

Таким образом добавление / изменение:

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

Как видно здесь, конструктор существует,

какие-нибудь другие мысли?

0

Решение

Пропущенные звонки _imp___ZN4miscC1Ev, который misc::misc() в соответствии с c++filtскорее всего означает, что класс misc отсутствует определенный конструктор по умолчанию. Убедитесь, что вы компилируете определение misc::misc(),

Для vtable ошибка, убедитесь, что вы предоставили определение (даже пустое или заглушенное) для каждой функции, объявленной в netm (или, как минимум, все виртуальные функции в netm). vtable класс ссылается на каждую виртуальную функцию, поэтому все виртуальные функции должны быть определены, иначе он не будет компилироваться.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]