QT编译时出现undefined reference错误

6
我将一个名为IcecastServer的类添加到我的QT项目中,将头文件添加到pro文件中并添加了一些代码。每次编译时都会出现以下错误: release/icecastserver.o: icecastserver.cpp:(.text+0x39): 对_imp___ZN10QTcpServerC1EP7QObject'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x50): 对imp_ZN12QHostAddressC1ENS_14SpecialAddressE'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x68): 对_imp___ZN10QTcpServer6listenERK12QHostAddresst'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x73): 对_imp_ZN12QHostAddressD1Ev'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x9d): 对_imp___ZNK10QTcpServer11errorStringEv'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x3d4): 对imp_ZN12QHostAddressD1Ev'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x4bd): 对_imp___ZN10QTcpServerC1EP7QObject'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x4d4): 对_imp_ZN12QHostAddressC1ENS_14SpecialAddressE'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x4ec): 对_imp___ZN10QTcpServer6listenERK12QHostAddresst'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x4f7): 对imp_ZN12QHostAddressD1Ev'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x521): 对_imp___ZNK10QTcpServer11errorStringEv'未定义的引用 release/icecastserver.o: icecastserver.cpp:(.text+0x858): 对_imp_ZN12QHostAddressD1Ev'未定义的引用 我做错了什么? 以下是头文件内容:
#ifndef ICECASTSERVER_H
#define ICECASTSERVER_H

#include <QObject>

QT_BEGIN_NAMESPACE
class QTcpServer;
QT_END_NAMESPACE

class IcecastServer : public QObject
{
    Q_OBJECT
public:
    explicit IcecastServer(QObject *parent = 0);

signals:

public slots:

private:
    QTcpServer *tcpServer;
};

#endif // ICECASTSERVER_H

这是源文件:

#include "icecastserver.h"
#include "QDebug"
#include <QtNetwork/QTcpServer>
#include <QtGui>

IcecastServer::IcecastServer(QObject *parent) :
    QObject(parent)
{

    tcpServer = new QTcpServer(this);
    //tcpServer->listen(QHostAddress::Any,8000);

    if (!tcpServer->listen()){
        QMessageBox::critical(NULL, tr("Fortune Server"), tr("Unable to start the server: %1.").arg(tcpServer->errorString()));

         return;
    }

}
2个回答

7

首先,您需要在某个地方包含#include <QHostAddress>,假设注释掉的行是导致问题的原因。

您还可以检查一些项目设置,以查看是否具有所有正确的输入。

编辑:更多细节

QtNetwork需要QT网络库输入。再次假设您正在使用QtCreator,因为没有提供太多信息,那么这意味着在您的.pro文件中,您需要像这样有一行:

QT += network

然后,在使用对象之前,请确保包含正确的头文件。如果仍然出现未定义的引用、链接错误等问题,请尝试进行QMake和重建。如果仍然存在问题,则可能存在代码错误以及QT使用错误,并且应验证所使用的方法和对象是否已正确声明。

最后编辑:很高兴那起作用了...

当您在QTCreator中创建新项目时,在向导中有一步可以勾选要包含的各种QT库,这将为您添加这些.pro行和输入。这是输入其他lib文件的QT版本,我相信默认情况下它们将被静态链接。如果您想使用共享对象或dll动态链接,那么还需要进行一些额外的配置步骤。


我添加了那个包含文件,但正如你所说,它被注释掉了,所以并没有解决问题。你在谈论哪些输入? - Hedge
对于 QT += network,可以在 https://doc.qt.io/qt-4.8/qmake-variable-reference.html#qt 找到相关资料。 - n611x007

1

您是否在您的头文件上运行了moc工具?并且随后编译了moc工具的输出?


我正在使用Qt Creator。我的做法是执行qmake,然后运行程序。 - Hedge
1
@Hedge QMake 运行 moc(元对象编译器)工具,所以假设您已经设置了 QtCreator 以在运行可执行文件之前构建过时的源代码,这将是肯定的默认行为。通常只有在更改或添加 Q_OBJECT 内容时才需要这样做。 - AJG85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接