Russian Qt Forum

Qt => Общие вопросы => Тема начата: Luck от Август 30, 2010, 14:58



Название: Сигналы и слоты в глобальных объектах
Отправлено: Luck от Август 30, 2010, 14:58
Здравствуйте.
Сегодня столкнулся с совершенно для себя не понятной проблемой...
Существует класс А, унаследованный от QObject, описанный в файле a.cpp. Класс содержит макрос Q_OBJECT. Больше в классе нету вообще ничего (я постепенно все, что в нем было убирал в целях выяснения причины ошибки и оказалось, что ошибка возникает именно при использовании макроса). Файл a.cpp входит в состав статической библиотеки lib.a. В файле a.cpp объявлена глобальная переменная A a;

class A: public QObject
{
     Q_OBJECT
};
A a;

Сама библиотека компилируется нормально. Однако при попытке компиляции приложения, использующего библиотеку появляется следующее:
error: In function `A::~A()':
error: undefined reference to `vtable for А'
error: In function `А::А()':
error: undefined reference to `vtable for А'
error: collect2: ld returned 1 exit status

Ошибка исчезает, если убрать макрос Q_OBJECT из класса или если убрать объявление переменной a.
Может, кто-то знает, в чем может быть дело? Помогите, пожалуйста.


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: alexman от Август 30, 2010, 15:02
Описание класса делай в h файле, если нужны сигналы/слоты!

Что-то не видно наследования???
Цитировать
class A
{
     Q_OBJECT
};
Что-то не видно наследования???


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: Luck от Август 30, 2010, 15:03
Прошу прощения - при редактировании кода для выкладывания сюда случайно убрал наследование. Описание в .h файле не помогло - ошибка та же.


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: BRE от Август 30, 2010, 15:07
Прошу прощения - при редактировании кода для выкладывания сюда случайно убрал наследование. Описание в .h файле не помогло - ошибка та же.
Выполни qmake после добавления Q_OBJECT


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: Luck от Август 30, 2010, 15:12
Прошу прощения - при редактировании кода для выкладывания сюда случайно убрал наследование. Описание в .h файле не помогло - ошибка та же.
Выполни qmake после добавления Q_OBJECT

Помогло, спасибо. Если не сложно, объясните, пожалуйста, в чем было дело.


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: BRE от Август 30, 2010, 15:13
Помогло, спасибо. Если не сложно, объясните, пожалуйста, в чем было дело.
В не чтении документации.  ;)


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: Luck от Август 30, 2010, 15:15
Помогло, спасибо. Если не сложно, объясните, пожалуйста, в чем было дело.
В не чтении документации.  ;)
О чем конкретно стоит почитать и где?


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: BRE от Август 30, 2010, 15:15
О чем конкретно стоит почитать и где?
Почитай в assistant про qmake и moc.


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: Luck от Август 30, 2010, 15:16
благодарю) почитаю


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: Denjs от Август 30, 2010, 17:10
Делать QMake вообще помогает при непонятных ошибках, особенно если на *_moc.cpp" файлы ругается.
После добавления классов, изменения структуры классов и т.п.
Собственно QMake (как я понимаю суть QT) запускает метакомпилятор, который делает много чего полезного связанного с переводом C++/QT на C++ того компилятора котрый вы используете...


Название: Re: Сигналы и слоты в глобальных объектах
Отправлено: break от Сентябрь 01, 2010, 01:25
Цитировать
Делать QMake вообще помогает при непонятных ошибках
К сожалению не всегда...

Цитировать
Собственно QMake (как я понимаю суть QT) запускает метакомпилятор, который делает много чего полезного связанного с переводом C++/QT на C++ того компилятора котрый вы используете...
Лично для меня это что-то новенькое - а именно связь qmake с конкретным компилятором. И никакая это не суть Qt - а просто система сборки, cmake его отлично заменяет.

По поводу нерешенных проблем qmake уже обсуждалось здесь:
http://www.prog.org.ru/index.php?topic=14425.msg94286#msg94286