Undefined reference (referência indefinida para vtable.Tentando compilar um projeto Qt
Pergunta
Eu estou usando Code::Blocks 8.02 e o mingw 5.1.6 compilador.Estou recebendo este erro quando compilar o meu projeto Qt:
C:\Documents e Settings\O Fuzz\Desktop\GUI\App_interface.cpp|33|não definido referência a "vtable para o Livro de endereços'
Ficheiro De Livro De Endereços.h:
#ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H
#include <QWidget>
class QLabel;
class QLineEdit;
class QTextEdit;
class AddressBook : public QWidget
{
Q_OBJECT
public:
AddressBook(QWidget *parent = 0);
private:
QLineEdit *nameLine;
QTextEdit *addressText;
};
#endif
Arquivo AddressBook.cpp:
#include <QtGui>
#include "addressbook.h"
AddressBook::AddressBook(QWidget *parent)
: QWidget(parent)
{
QLabel *nameLabel = new QLabel(tr("Name:"));
nameLine = new QLineEdit;
QLabel *addressLabel = new QLabel(tr("Address:"));
addressText = new QTextEdit;
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(nameLabel, 0, 0);
mainLayout->addWidget(nameLine, 0, 1);
mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
mainLayout->addWidget(addressText, 1, 1);
setLayout(mainLayout);
setWindowTitle(tr("Simple Address Book"));
}
Solução
AVISO: Não faça isso se você já tiver um arquivo .pro - você o perderá!
Para garantir automaticamente que todos os arquivos MOC CPP sejam gerados, você pode obter o QMake para gerar automaticamente um arquivo .pro para você, em vez de escrever um.
Corre
qmake -project
No diretório do projeto, e o QMake digitalizará seu diretório em busca de todos os cabeçalhos C ++ e arquivos de origem para gerar arquivos MOC CPP.
Outras dicas
Ao usar o QT Creator:
- Construir → Executar QMake
- Construir → reconstruir tudo
O problema é quase certamente que você não está compilando ou não está vinculando o arquivo gerado moc_addressbook.cpp. (Deveria ter sido gerado para você - você está executando QT's moc
Em seu código antes de compilar, certo?)
Para responder um pouco mais bem, o Q_OBJECT
Macro sinais QT's moc
ferramenta para criar um arquivo de implementação extra que contém o código necessário para apoiar QObject
Sistema de meta-informações. Se você tivesse algum sinal ou slots, isso faria algumas coisas para elas também.
Uma solução alternativa pode ser remover o Q_OBJECT
macro. Você provavelmente não quer fazer isso, mas ajudaria o problema imediato, e não é estritamente necessário com o código que você apresentou.
Além disso, eu notaria que sua linha:
#include "addressbook.h"
Provavelmente deveria ser:
#include "AddressBook.h"
Com base em como você apresentou os nomes de arquivos na pergunta.
Supondo que você esteja usando o QMake para gerar seu makefile, certifique -se de que o endereço de endereço.
HEADERS = AddressBook.h
Eu consegui isso enquanto usava funções virtuais puras. Por exemplo,
virtual void process();
deu este erro, enquanto
virtual void process() = 0;
fez isso desaparecer.
Para quem está pesquisando esse problema no Google, verifique se todas as funções virtuais são definidas. (via "= 0" ou uma definição completa no arquivo de origem) Estou usando o NetBeans com o compilador Mingw.
Para projetos de cmake, defina cmake_automoc, isso corrigiu meu problema.
#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
Eu tive o mesmo problema, mas assim que defini meu construtor no arquivo de cabeçalho em vez do .CPP, o erro desapareceu. Além disso, o arquivo MOC correspondente estava ausente no sistema de arquivos e na seção Makefile "compiler_moc_header_make_all". Eu corri um qmake e finalmente tudo construído com sucesso. Fui verificar o Makefile e estava lá agora.
excluiu a pasta de construção, reiniciou o QT Creator e funcionou
Chego ao mesmo problema, reconstruo o projeto nunca atualize o Makefile, removo o Makefile e a reconstrução, o problema se foi. PS: Run 'Make' da linha de comando pode fornecer informações detalhadas do que o IDE e útil para obter o problema real.
Uma causa é quando você declara funções virtuais em uma aula e não define o corpo deles.
No meu caso, a reconstrução de tudo não foi suficiente, eu tive que excluir o diretório de construção e fazer reconstruir tudo - então funcionou!
Vá para o arquivo .Pro e verifique se o arquivo .h possui 'incluir' antes dele. Cabeçalhos += incluir/file.h incluir/file2.h
Eu tive o mesmo problema tentando usar uma função virtual protegida. Duas coisas funcionaram.
- Mudando
void process();
paravoid process() = 0;
- Fazer
process()
público em vez de privado
Você receberá a mesma mensagem de erro se acidentalmente adicionar um protótipo de destruidor. Adicione uma definição de destruidor vazio ou remova o protótipo.
Simplesmente Run qmake
para o seu projeto. Isso pode ser feito facilmente clicando com o botão direito do mouse no nome do seu projeto e clicando em Run qmake
.
Arquivos de cabeçalho para o moc compilação deve contidas nos CABEÇALHOS += ...variável:
Eu movi os arquivos de cabeçalho no Myproject.pro para as FONTES += ...seção, porque eu quero ter mySource.h e mySource.cpp na mesma árvore elemento.Mas o que é defeito para o QT Creator.Em resultado, o erro de "undefined reference (referência Indefinida para vtable" ocorreu.Parece ser:QT detecta cabeçalho para moc compilação apenas nos CABEÇALHOS +=...seção (ou variável).Ver também a correta explicação no outros stackoverflow resposta Segundo anwer "eu vi um monte de maneiras de resolver o problema, mas nenhuma explicação para por que isso acontece, então aqui vai.".Na minha opinião esta é exatamente a explicação do problema, o que tem me ajudar a encontrar e resolver o meu problema.
Estou usando o QT Creator para compilar e executar meus programas, não uso Prompt de comando QT muitas vezes. Uma coisa que fiz para me livrar do erro irritante "vtable algo algo"é adicionando as seguintes linhas a .pro
Arquivo.
Modelo = app
Qt += núcleo