#c #qt #linker #header-files
#c #qt #компоновщик #заголовочные файлы
Вопрос:
Я добавил класс IcecastServer в свой QT-проект, добавил файл заголовка в файл pro и добавил некоторый код. Каждый раз, когда я его компилирую, возникают следующие ошибки:
release/icecastserver.o:icecastserver.cpp :(.text 0x39): неопределенная ссылка на
_imp___ZN10QTcpServerC1EP7QObject'
impZN12QHostAddressC1ENS_14SpecialAddressE’ release/icecastserver.o:icecastserver.cpp :(.text 0x68): неопределенная ссылка на
release/icecastserver.o:icecastserver.cpp:(.text 0x50): undefined reference to_imp___ZN10QTcpServer6listenERK12QHostAddresst'
_imp_ZN12QHostAddressD1Ev’ release/icecastserver.o:icecastserver.cpp :(.text 0x9d): неопределенная ссылка на
release/icecastserver.o:icecastserver.cpp:(.text 0x73): undefined reference to_imp___ZNK10QTcpServer11errorStringEv'
impZN12QHostAddressD1Ev’ release/icecastserver.o:icecastserver.cpp :(.text 0x4bd): неопределенная ссылка на
release/icecastserver.o:icecastserver.cpp:(.text 0x3d4): undefined reference to_imp___ZN10QTcpServerC1EP7QObject'
_imp_ZN12QHostAddressC1ENS_14SpecialAddressE’ release/icecastserver.o:icecastserver.cpp :(.text 0x4ec): неопределенная ссылка на
release/icecastserver.o:icecastserver.cpp:(.text 0x4d4): undefined reference to_imp___ZN10QTcpServer6listenERK12QHostAddresst'
impZN12QHostAddressD1Ev’ release/icecastserver.o:icecastserver.cpp :(.text 0x521): неопределенная ссылка на
release/icecastserver.o:icecastserver.cpp:(.text 0x4f7): undefined reference to_imp___ZNK10QTcpServer11errorStringEv'
_imp_ZN12QHostAddressD1Ev’
release/icecastserver.o:icecastserver.cpp:(.text 0x858): undefined reference to
Что я делаю не так?
Это заголовочный файл:
#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
материала.