erro de referência indefinido com sinais e slots
-
26-09-2019 - |
Pergunta
Usando o QT Creator, estou criando uma classe com slots personalizados no QT:
class CustomEdit : public QTextEdit
{
Q_OBJECT
public:
CustomEdit(QWidget* parent);
public slots:
void onTextChanged ();
};
No entanto, estou recebendo esse erro de vinculador:
undefined reference to 'vtable for CustomEdit'
A documentação diz:
Se você receber erros do compilador a longo de "referência indefinida ao VTable for LCDNumber", provavelmente esqueceu de executar o MOC ou incluir a saída MOC no comando Link.
... mas não é óbvio o que isso significa.
Existe algo que preciso adicionar à minha aula ou ao arquivo .pro?
EDITAR - Aqui está meu arquivo .pro:
QT += network \ script \ webkit \ xml TARGET = MyApp TEMPLATE = app SOURCES += main.cpp \ MainWindow.cpp \ CustomEdit.cpp HEADERS += MainWindow.h \ CustomEdit.h FORMS += mainwindow.ui
EDITAR:
Essa questão Lida com os mesmos problemas, mas as respostas não deixam claro como posso corrigir esse problema no QT Creator. Preciso adicionar explicitamente o arquivo .cpp gerado pelo MOC à minha lista de arquivos a ser vinculada? Isso parece uma dor.
Solução
O QT Creator é um IDE usado para criar seus projetos QT. Isso é tudo. Mas o QMake permite que você compre o projeto. A partir de Manual QMake,
O QMake automatiza a geração de makefiles para que apenas algumas linhas de informação sejam necessárias para criar cada makefile. O QMake gera um makefile com base nas informações em um arquivo de projeto. O QMake contém recursos adicionais para apoiar o desenvolvimento com QT, incluindo automaticamente as regras de construção para MOC e UIC.
Você não deve incluir seus arquivos MOC separadamente, mas é necessário executar o QMake, que contém todas as informações sobre os arquivos MOC necessários. Dê uma olhada no gerado Makefile.debug
ou Makefile.release
Após o QMake e você pode encontrar todos os arquivos MOC serão incluídos para você.
Agora, para executar o Qmake no QT Creator, basta ir para Build->RebuildAll
que executarão os arquivos QMake e todos os arquivos (MOC) também serão gerados e vinculados (no makefile.debug).
Espero que isso elimine sua referência indefinida.