2010-02-02 15 views
5

De vez en cuando se utiliza GCC tengo errores crípticos como esto:depuración vtable errores de enlace en GCC

referencia indefinida a 'vtable para el nombre de clase'

Cuando no está causada por una biblioteca que falta, esta no- Un mensaje de error muy descriptivo siempre me lleva a buscar archivos de código línea por línea para encontrar la implementación faltante para una función virtual. ¿Hay alguna manera de hacer que el enlazador me diga qué función virtual falta, quizás una bandera o algo así? ¿O quizás me está diciendo pero no entiendo lo que está diciendo?

Respuesta

2

De gcc faq:

Cuando la construcción de C++, el enlazador que dice mi constructores, destructores o virtuales tablas no están definidos, pero define ellos

El C++ estándar ISO especifica que todos los métodos virtuales de una clase que no son puros virtual deben ser definidos, pero no requiere ningún diagnóstico por violaciones de esta regla [class.virtual]/8. Basándose en esta suposición , GCC solamente emitirá las constructores implícitamente definidas, el operador de asignación, el destructor y la tabla virtual de una clase en la unidad de traducción que define su primera método no-inline tales .

Por lo tanto, si no para definir este método en particular, el enlazador puede quejarse de la falta de definiciones para los símbolos aparentemente no relacionadas. Desafortunadamente, para mejorar este mensaje de error, podría ser necesario para cambiar el enlazador, y esto no siempre se puede hacer.

La solución es asegurarse de que todos los métodos virtuales que no son puros son definido. Tenga en cuenta que un destructor debe definirse incluso si se declara -virtual pura [class.dtor]/7.

La solución que adopto es buscar el nombre de clase y buscar la declaración de métodos virtuales y verificar si existe alguna definición. No encontré ninguna otra solución para esto.

Cuestiones relacionadas