2010-02-02 12 views
5

Di tanto in tanto quando si usa GCC ottengo errori criptici come questo:debug vtable errori del linker a GCC

undefined reference to 'vtable per nomeclasse'

Quando non è causato da una libreria mancante, questo non- un messaggio di errore molto descrittivo mi porta sempre a scavare i file di codice riga per riga per trovare l'implementazione mancante per una funzione virtuale. C'è un modo per farmi dire al linker quale funzione virtuale manca, forse una bandiera o qualcosa del genere? O forse mi sta dicendo ma non capisco cosa sta dicendo?

risposta

2

Da gcc faq:

Quando si costruisce C++, il linker dice il mio costruttori, distruttori o virtuali tabelle non sono definite, ma ho definito loro

L'ISO C++ standard specifica che tutti i metodi virtuali di una classe che non sono puramente virtuali devono essere definiti, ma non richiede alcuna diagnostica per violazioni di questa regola [class.virtual]/8. Sulla base di questa ipotesi , GCC emette solo i costruttori implicitamente definiti, l'operatore assegnazione, il distruttore e la tabella virtuale di una classe in l'unità di traduzione che definisce la prima tale metodo non in linea.

Pertanto, se non si riesce a definire questo particolare metodo, il linker può lamentano la mancanza di definizioni per i simboli apparentemente non correlati. Sfortunatamente, per migliorare questo messaggio di errore, potrebbe essere necessario modificare il linker e questo non può essere sempre fatto.

La soluzione è garantire che tutti metodi virtuali che non sono puri sono definiti. Si noti che un distruttore deve essere definito anche se è dichiarato pure-virtual [class.dtor]/7.

La soluzione che adotto è cercare il nome di classe e ricercare la dichiarazione dei metodi virtuali e controllare se esiste una definizione. Non ho trovato alcuna altra soluzione per questo.