Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > undefined reference на этапе Сборки


Автор: everyone 24.10.2010, 23:52
Создал оконное приложение и пытаюсь получить страницу по http

Добавил в projectname.pro строку QT += network

код в mainwindow.cpp:

Код

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(replyFinished(QNetworkReply*)));

    manager->get(QNetworkRequest(QUrl("http://www.example.com")));



слот:

Код

void MainWindow::replyFinished(QNetworkReply* reply){
    qDebug() << reply->readAll();
}


Всё компилируется и работает.

Но если создать произвольный класс(в отдельном файле) и функцию в нём с параметром типа QNetworkReply, то линковщик выдаёт:

debug/moc_testclass.o:C:\qtprj\test-build-desktop/debug/moc_testclass.cpp:72: undefined reference to `testclass:smile(QNetworkReply*)'

Qt 4.7.0 (win32)

Автор: null56 25.10.2010, 01:10
запусти еще раз qmake и пересобери проект
если не прокатит, скинь содержимое файла проекта (*.pro) сюда

Автор: everyone 25.10.2010, 01:27
нет, всё то же самое

содержимое .pro:
Код

#-------------------------------------------------
#
# Project created by QtCreator 2010-10-15T13:21:46
#
#-------------------------------------------------

QT       += core gui
QT += network

TARGET = testapp
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    table.cpp \
    swaper.cpp

HEADERS  += mainwindow.h \
    table.h \
    swaper.h

FORMS    += mainwindow.ui

OTHER_FILES += \
    test.ahk \
    AutoHotkey.dll \
    AutoHotkey.lib



проблема возникает в swaper. Его создаёт table, который создаётся в mainwindow. Но это вряд ли имеет значение

Автор: null56 25.10.2010, 11:17
не совсем понятно, на что ругается линковщик... на слот, на метод или на что - то другое... опишите пожалуйста поподробнее

Добавлено @ 11:18
приведите пожалуйста файл swaper.h, хотя бы его существенную часть

Автор: everyone 25.10.2010, 12:23
swaper.h:

Код

#ifndef SWAPER_H
#define SWAPER_H

#include <QtNetwork/QNetworkReply>
#include <QThread>
#include <QString>

class Swaper : public QThread
{
    Q_OBJECT
public:
    explicit Swaper(QString tableID);
    void run();
private:
    QString TID;
signals:

public slots:
    void hi(QNetworkReply *k);

};

#endif // SWAPER_H


такие ошибки очень сбивают с толку) буду очень рад, если поможете

Автор: everyone 25.10.2010, 15:29
Так всё компилируется:

Код

#ifndef SWAPER_H
#define SWAPER_H
#include <QtNetwork/QNetworkReply>
#include <QThread>
#include <QString>
class Swaper : public QThread
{
    Q_OBJECT
public:
    explicit Swaper(QString tableID);
    void run();
private:
    QString TID;
signals:
public slots:
    void hi(QNetworkReply *k){
    //....
    }

};
#endif // SWAPER_H



void hi(QNetworkReply *k) - слот и, наверно, должен быть обязательно реализован.

Автор: null56 25.10.2010, 18:31
Цитата(everyone @  25.10.2010,  15:29 Найти цитируемый пост)
void hi(QNetworkReply *k) - слот и, наверно, должен быть обязательно реализован. 

должен, но также должен быть в cpp файле

Добавлено @ 18:35
проект большой?
если нет, сархивируй его, и кинь ссылку в личку

Автор: djamshud 25.10.2010, 18:50
Реализация метода именно в цпп - совершенно необязательное условие. Нужно просто его реализовать.

>слот и, наверно, должен быть обязательно реализован.

Обычно все методы должны быть реализованы, иначе их практическая ценность стремится к нулю:).

Автор: null56 25.10.2010, 19:18
Цитата(djamshud @  25.10.2010,  18:50 Найти цитируемый пост)
Реализация метода именно в цпп - совершенно необязательное условие. Нужно просто его реализовать.

да ты прав... но это я писал ТОЛЬКО в отношении слотов, у меня вроде раньше были проблемы с определением их в загаловке... даже тему поднимал по этому поводу... но сейчас вроде линкуются или я чего путаю

Добавлено через 7 минут и 27 секунд
я на это ссылаюсь
Цитата

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

Классы, в определении которых встречается макрос Q_OBJECT, должны обрабатываться компилятором метаобъектов в обязательном порядке. На самом деле, это не такая большая проблема, поскольку qmake автоматически добавит все необходимые правила в Makefile. Но если вы забудете перегенерировать Makefile, то линковщик будет "жаловаться" на отсутствие некоторых функций. Эти сообщения об ошибках могут порой вводить в заблуждение. Например, GCC выдает примерно такое предупреждение:

   finddialog.o(.text+0x28): undefined reference to  
   FindDialog::QPaintDevice virtual table    
      

Visual C++ такое:

   finddialog.obj : error LNK2001: unresolved external symbol 
   "public:~virtual bool __thiscall FindDialog::qt_property(int, 
   int,class QVariant *)"      
      
Если это произошло, то перезапустите qmake еще раз, чтобы обновить Makefile, а затем пересоберите приложение.


Добавлено через 7 минут и 43 секунды
это из книги, но могло уже поменяться все

Автор: djamshud 25.10.2010, 19:26
Никогда не встречал такой проблемы и не вижу объективных причин ее возникновения. Если с вынесением кода из описания класса в тот же заголовочный файл все понятно, то почему должно что-то перестать работать (линковаться!) при сохранении кода внутри описания класса, не ясно.

Автор: null56 25.10.2010, 21:13
everyone, скинь свой проект куда - нибудь... попробую собрать

Автор: everyone 25.10.2010, 22:05
Цитата

должен, но также должен быть в cpp файле

ну, почему бы не реализовать слот в заголовочном файле?

да вроде всё выяснили, всё собирается, я же говорю) это был просто тестовый пример, я удалил уже.

всем спасибо smile 

Автор: null56 25.10.2010, 22:22
Цитата(everyone @  25.10.2010,  22:05 Найти цитируемый пост)
ну, почему бы не реализовать слот в заголовочном файле?

я просто предполагал возможные ошибки, как вариант moc... отрывок из книги я привел... конечно можно в заголовке

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)