Undefined reference (referência indefinida para vtable.Tentando compilar um projeto Qt

StackOverflow https://stackoverflow.com/questions/1552069

  •  20-09-2019
  •  | 
  •  

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"));
}
Foi útil?

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:

  1. Construir → Executar QMake
  2. 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 QObjectSistema 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.

  1. Mudando void process(); para void process() = 0;
  2. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top