Ошибки неопределенных ссылок QT при попытке компиляции

#c #qt #linker #header-files

#c #qt #компоновщик #заголовочные файлы

Вопрос:

Я добавил класс IcecastServer в свой QT-проект, добавил файл заголовка в файл pro и добавил некоторый код. Каждый раз, когда я его компилирую, возникают следующие ошибки:

release/icecastserver.o:icecastserver.cpp :(.text 0x39): неопределенная ссылка на _imp___ZN10QTcpServerC1EP7QObject'
release/icecastserver.o:icecastserver.cpp:(.text 0x50): undefined reference to
impZN12QHostAddressC1ENS_14SpecialAddressE’ release/icecastserver.o:icecastserver.cpp :(.text 0x68): неопределенная ссылка на _imp___ZN10QTcpServer6listenERK12QHostAddresst'
release/icecastserver.o:icecastserver.cpp:(.text 0x73): undefined reference to
_imp
_ZN12QHostAddressD1Ev’ release/icecastserver.o:icecastserver.cpp :(.text 0x9d): неопределенная ссылка на _imp___ZNK10QTcpServer11errorStringEv'
release/icecastserver.o:icecastserver.cpp:(.text 0x3d4): undefined reference to
impZN12QHostAddressD1Ev’ release/icecastserver.o:icecastserver.cpp :(.text 0x4bd): неопределенная ссылка на _imp___ZN10QTcpServerC1EP7QObject'
release/icecastserver.o:icecastserver.cpp:(.text 0x4d4): undefined reference to
_imp
_ZN12QHostAddressC1ENS_14SpecialAddressE’ release/icecastserver.o:icecastserver.cpp :(.text 0x4ec): неопределенная ссылка на _imp___ZN10QTcpServer6listenERK12QHostAddresst'
release/icecastserver.o:icecastserver.cpp:(.text 0x4f7): undefined reference to
impZN12QHostAddressD1Ev’ release/icecastserver.o:icecastserver.cpp :(.text 0x521): неопределенная ссылка на _imp___ZNK10QTcpServer11errorStringEv'
release/icecastserver.o:icecastserver.cpp:(.text 0x858): undefined reference to
_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;
    }

}
  

Ответ №1:

Сначала вам нужно #include <QHostAddress> где-то предположить, что закомментированная строка является причиной проблемы.

Вы также можете проверить некоторые настройки проекта, чтобы убедиться, что у вас есть все правильные входные данные.

Редактировать: Более подробно

Для QtNetwork требуются входные данные QT network lib. Еще раз предполагая, что вы используете QtCreator, поскольку было предоставлено не так много информации, это означает, что в вашем файле .pro вам нужно иметь строку, подобную so:

QT = network

Затем убедитесь, что вы включили правильные заголовки для объектов, которые вы используете, прежде чем использовать их. Если вы все еще получаете неопределенные ссылки, ошибки компоновки и т.д., Попробуйте QMake и перестройте. Если это все еще сохраняется, у вас, вероятно, есть ошибки в вашем коде в дополнение к ошибкам использования QT, и вам следует проверить, что используемые вами методы и объекты были правильно объявлены.

Заключительная правка: Рад, что сработало…

Когда вы создаете новый проект в QtCreator, в мастере есть шаг, на котором вы можете отметить различные библиотеки QT, которые вы хотите включить, которые добавят эти строки .pro и входные данные для вас. Это версия QT для ввода дополнительных файлов lib, и по умолчанию они будут статически связаны, я полагаю. Если вы хотите динамически связываться с разделяемыми объектами или dll, тогда есть несколько дополнительных шагов настройки.

Комментарии:

1. Я добавил это, но, как вы сказали, это закомментировано, так что это не решило проблему. О каких входных данных вы говорите?

2. QT = network ссылку можно найти по адресу doc.qt.io/qt-4.8/qmake-variable-reference.html#qt

Ответ №2:

Вы запускаете moc инструмент над своим заголовочным файлом? Вы впоследствии компилируете выходные данные из moc инструмента?

Комментарии:

1. Я использую Qt Creator. Что я сделал, так это выполнил qmake, а затем запустил программу.

2. @Hedge QMake запускает инструмент moc (компилятор метаобъектов), так что это будет да, при условии, что у вас есть настройка QtCreator для сборки устаревших исходных текстов перед запуском исполняемого файла, который является поведением по умолчанию. Обычно это нужно делать только при изменении или добавлении Q_OBJECT материала.