Obtendo “Referência indefinida para vtable para {classname}

Tenho uma grande coleção de bibliotecas que compilam corretamente, mas não são vinculadas. Estou usando o Visual Micro para Visual Studio 2015. Aqui está a coleção completa de mensagens de erro:

CommandPattern3.cpp.o:In function `DualMotorRomeo DualMotorRomeo.h:undefined reference to `vtable for DualMotorRomeo DualMotorRomeo.h:undefined reference to `vtable for DualMotorRomeo CommandPattern3.cpp.o:In function `__static_initialization_and_destruction_0 CommandPattern3.ino:undefined reference to `DualMotorRomeo ~DualMotorRomeo() collect2.exe*:error: ld returned 1 exit status Error compiling for board Arduino/Genuino Mega w/ ATmega2560 (Mega 2560) 

Eu examinei o código com um pente de dentes finos, mas não pode ver quais referências são indefinidas.

Existe algum utilitário do Windows 10 que pode examinar as vTables e me ajudar a encontrar o que está faltando?

O código-base é muito grande para ser postado, mas posso fornecer um arquivo ZIP com todo o código para qualquer pessoa que queira ajudar.

Comentários

  • O vinculador está se esforçando para ajudá-lo. Verifique DualMotorRomeo.h e se há um destruidor (pode precisar ser virtual dependendo da herança?).

Resposta

Não tenho o arquivo de cabeçalho para DualMotorRomeo, mas o vinculador está dizendo que um destruidor foi declarado (~DualMotorRomeo() ) no cabeçalho da classe, mas nenhum destruidor foi definido. Se você não escreveu DualMotorRomeo, a biblioteca precisa ser atualizada.

Até lá, basta adicione o seguinte a um de seus arquivos de origem:

DualMotorRomeo::~DualMotorRomeo() { } // DualMotorRomeo::~DualMotorRomeo() 

Isso também corrigirá os vtable erros do linker – o vtable será incluído no arquivo compilado com isso declarado nele.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *