Поиск:

Ответ в темуСоздание новой темы Создание опроса
> undefined reference на этапе Сборки, при использовании QNetworkReply 
V
    Опции темы
everyone
  Дата 24.10.2010, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 24.3.2004

Репутация: нет
Всего: 4



Создал оконное приложение и пытаюсь получить страницу по 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)
--------------------
Что написал, то написал (Пилат)
PM ICQ Skype   Вверх
null56
Дата 25.10.2010, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



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

Это сообщение отредактировал(а) null56 - 25.10.2010, 01:16
PM MAIL   Вверх
everyone
Дата 25.10.2010, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 24.3.2004

Репутация: нет
Всего: 4



нет, всё то же самое

содержимое .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. Но это вряд ли имеет значение

--------------------
Что написал, то написал (Пилат)
PM ICQ Skype   Вверх
null56
Дата 25.10.2010, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



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

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


Это сообщение отредактировал(а) null56 - 25.10.2010, 11:18
PM MAIL   Вверх
everyone
Дата 25.10.2010, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 24.3.2004

Репутация: нет
Всего: 4



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


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

--------------------
Что написал, то написал (Пилат)
PM ICQ Skype   Вверх
everyone
Дата 25.10.2010, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 24.3.2004

Репутация: нет
Всего: 4



Так всё компилируется:

Код

#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) - слот и, наверно, должен быть обязательно реализован.
--------------------
Что написал, то написал (Пилат)
PM ICQ Skype   Вверх
null56
Дата 25.10.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



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

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

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

Это сообщение отредактировал(а) null56 - 25.10.2010, 18:37
PM MAIL   Вверх
djamshud
Дата 25.10.2010, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 5
Всего: 39



Реализация метода именно в цпп - совершенно необязательное условие. Нужно просто его реализовать.

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

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
null56
Дата 25.10.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Цитата(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 секунды
это из книги, но могло уже поменяться все

Это сообщение отредактировал(а) null56 - 25.10.2010, 19:18
PM MAIL   Вверх
djamshud
Дата 25.10.2010, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 5
Всего: 39



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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
null56
Дата 25.10.2010, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



everyone, скинь свой проект куда - нибудь... попробую собрать
PM MAIL   Вверх
everyone
Дата 25.10.2010, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 24.3.2004

Репутация: нет
Всего: 4



Цитата

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

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

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

всем спасибо smile 
--------------------
Что написал, то написал (Пилат)
PM ICQ Skype   Вверх
null56
Дата 25.10.2010, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



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

я просто предполагал возможные ошибки, как вариант moc... отрывок из книги я привел... конечно можно в заголовке
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0661 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.