Ошибка неопределенного эталонного линкера с сигналами и слотами
-
26-09-2019 - |
Вопрос
Используя QT Creator, я создаю класс с пользовательскими слотами в Qt:
class CustomEdit : public QTextEdit
{
Q_OBJECT
public:
CustomEdit(QWidget* parent);
public slots:
void onTextChanged ();
};
Тем не менее, я получаю эту ошибку линкера:
undefined reference to 'vtable for CustomEdit'
Документация говорит:
Если вы получаете ошибки компилятора вдоль линий «неопределенной ссылки на VTable для LCDNumber», вы, вероятно, забыли запустить MOC или включить вывод MOC в команде ссылки.
... Но это не очевидно, что это значит.
Есть ли что-то, что мне нужно добавить в мой класс, или в файл .pro?
РЕДАКТИРОВАТЬ - Вот мой файл .PRO:
Qt + = Network Script webkit xml target = myapp template = Источники приложений + = main.cpp mainwindow.cpp shadowdit.CPP заголовки + = mainwindow.h shadowedit.h Формы + = mainwindow.ui
РЕДАКТИРОВАТЬ:
Этот вопрос Справляются с теми же проблемами, но ответы не устраивают, как я могу исправить эту проблему в Qt Creator. Нужно ли явно добавить файл MOC-Genered .CPP в мой список файлов, которые будут связаны? Это похоже на боль.
Решение
QT Creator - это IDE, которая используется для создания ваших проектов QT. Это все. Но qmake позволяет вам погасить проект. От Руководство QMake,
qmake автоматизирует генерацию makefiles так, что требуется только несколько строк информации для создания каждого Makefile. qmake генерирует makefile на основе информации в файле проекта. QMake содержит дополнительные функции для поддержки разработки с QT, автоматически включающей правила сборки для MOC и UIC.
Вам не нужно включать ваши файлы MOC отдельно, но вам нужно запустить qmake, которая содержит всю информацию о необходимых файлах MOC. Посмотрите на сгенерированный Makefile.debug
или Makefile.release
После Qmake и вы можете найти все файлы MOC для вас.
Теперь, чтобы запустить QMake в Qt Creator, просто перейдите к Build->RebuildAll
Которые будут запускать Qmake и все файлы (MOC) будут сгенерированы и связаны (в makefile.debug) также.
Надеюсь, это будет эмиматно вашу неопределенную ссылку.