Russian Qt Forum

Qt => Общие вопросы => Тема начата: yarick от Январь 19, 2013, 21:02



Название: undefined reference to ‘vtable - неужели нет решения для main.cpp?
Отправлено: yarick от Январь 19, 2013, 21:02
Если класс с макросом Q_Object объявить перед main.cpp - то компилятор выдаст ошибку "undefined reference to ‘vtable ...".
Это происходит потому, что moc-препроцессор не обрабатывает cpp а обрабатывает только h. Соответственно проблема решается грамтоным размещением объявления класса с макросом в h-файле, а тела класса - в cpp. Все мои классы я так и делаю.

Однако я создаю собственную библиотеку примеров кода, на которой показываю использование тех или иных языковых элементов и классов.
И для неё крайне нежелательно создавать класс в отдельном файле - пропадает наглядность, и вообще не удобно. Я пытался обмануть qmake, включая HEADERS += main.cpp - но это не работает.

По-сути класс мне нужен только для того чтобы в него запихнуть слоты и показать примеры работы сигналов.
Вижу следующие пути решения проблемы:
  • Заставить qmake обрабатывать мой cpp файл каким-то образом, вот только каким?
  • Соединить сигналы с обычными функциями, только помойму это не возможно сделать. Можно ли как-то отследить сигналы без слотов?


Название: Re: undefined reference to ‘vtable - неужели нет решения для main.cpp?
Отправлено: kambala от Январь 19, 2013, 21:13
в конец main.cpp допиши #include "main.moc"


Название: Re: undefined reference to ‘vtable - неужели нет решения для main.cpp?
Отправлено: yarick от Январь 20, 2013, 07:41
в конец main.cpp допиши #include "main.moc"
Спасибо, это действительно работает!
Получается что препроцессор создаёт moc-файлы для cpp но не включает их?


Название: Re: undefined reference to ‘vtable - неужели нет решения для main.cpp?
Отправлено: Alex Custov от Январь 21, 2013, 17:03
в конец main.cpp допиши #include "main.moc"
Спасибо, это действительно работает!
Получается что препроцессор создаёт moc-файлы для cpp но не включает их?

Это указание для qmake, который во время парсинга .pro файла и переменной SOURCES, проверяет наличие такой строки в .cpp файлах, и создаёт нужные .moc файлы. Если данной директивы нет, то moc файлы создаются как обычно и только там, где нужно.