2009-11-07 14 views
35

Quasi il passo finale, ma ancora alcuni strani erros ....Simboli indefiniti "vtable for ..." e "typeinfo for ..."?

bash-3.2$ make 
g++ -Wall -c -g Myworld.cc 
g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o World.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem 
Undefined symbols: 
    "vtable for Obstacle", referenced from: 
     Obstacle::Obstacle()in Myworld.o 
    "typeinfo for Obstacle", referenced from: 
     typeinfo for RECTANGLEin RECTANGLE.o 
     typeinfo for CIRCLEin CIRCLE.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make: *** [solvePlanningProblem] Error 1 

Qual è il significato di vtable e typeinfo?

+0

Ricorda di tornare a [la tua domanda iniziale] (http://stackoverflow.com/questions/1693471/undefined-symbols-ld-symbol-not-found) e pubblicare un codice o rispondere ad alcune delle domande che le persone hanno ti ho chiesto lì. Probabilmente otterrai risultati più rapidi. :) – Troubadour

+0

voglio davvero ma il sito manca solo, grazie, tornerò – Lisa

+0

per favore trovare la risposta qui! http://stackoverflow.com/questions/1458180/vtable-for-referenced-from-compile-error-xcode –

risposta

1

vtable e typeinfo sono strutture interne generate dal compilatore C++. vtable è usato per chiamare funzioni virtuose e typeinfo è usato per RTTI.

Diversi compilatori hanno strategie diverse per quando generano queste strutture. Una strategia che ho visto è che genereranno la tabella nello stesso file oggetto che contiene la prima funzione virtuale nella classe.

+0

per quanto riguarda l'errore di cui sopra, cosa significa simboli non definiti? – Lisa

2

Hai un file Obstacle.cc? In tal caso, è necessario assicurarsi che venga incorporato in Obstacle.o e che Obstacle.o venga aggiunto alla riga di comando quando si collega il programma.

Inoltre, assicurarsi di definire tutti i metodi non puramente virtuali dichiarati. Se dichiari un distruttore virtuale puro, devi definirlo anche tu.

+0

devo avere un Obstacle.cc, dal momento che ha solo alcune funzioni virtuali? – Lisa

+0

@Lisa: non necessariamente, ma la definizione di metodi/funzioni non incorporati non in un file .h può portare a un errore di linker diverso (più definizioni). Quindi suppongo che tutto in Obstacle sia in linea. Hai scritto le definizioni per tutte le funzioni membro di Obstacle, inclusi il costruttore (i) e il distruttore? Nota che se Obstacle ha un distruttore virtuale puro, devi comunque scrivere una definizione per questo. – bk1e

+0

Obstacle ha solo funzioni virtuali pure? Colpiscilo: non importa quando si tratta di vtables. Hai bisogno di un Obstacle.o in modo che il compilatore abbia un posto dove salvare la tabella virtuale di Obstacle e digitare informazioni. – outis

70

Se ostacolo è una classe base astratta, quindi assicuratevi di dichiarare tutti i suoi metodi virtuali "puri virtuale":

virtual void Method() = 0; 

Il = 0 dice al compilatore che questo metodo deve essere sovrascritto da una classe derivata, e potrebbe non avere una sua implementazione.

Se la classe contiene funzioni virtuali non pure, il compilatore presupporrà di avere un'implementazione da qualche parte e le sue strutture interne (vtable e typeinfo) potrebbero essere generate nello stesso file oggetto di una di quelle; se quelle funzioni non sono implementate, allora le strutture interne mancheranno e otterrai questi errori.

+0

Ho appena trovato questo problema nel mio codice. Ho trovato questa pagina tramite la ricerca di Google e ho apportato la modifica che hai detto e risolta. Grazie! : D – Aishwar

+0

Come sopra - trovato su google - problema risolto subito, la soluzione era semplice e veloce! Ho aggiunto un altro membro virtuale puro a un elenco di funzioni virtuali e ho dimenticato di aggiungere il token = 0! oops – Marm0t

+0

Ottima risposta - risolto anche il mio problema! – TCSGrad

5

L'ostacolo della classe ha bisogno di un distruttore virtuale. Cambiare la definizione del distruttore in modo che sia:

virtual ~Obstacle(); 

La definizione di un distruttore crea anche il vtable per una classe con funzioni virtuali. Garantisce inoltre che l'eliminazione di un'istanza di classe derivata tramite un puntatore di classe base faccia la cosa giusta.

(copia della mia risposta alla domanda What should I do with this strange error? che sembra essere un duplicato.)

+2

Nel mio caso, non solo avevo bisogno di definire il distruttore ma ho anche dimenticato di definire l'implementazione nel mio file cpp. – Ricket

1

C'è un altro motivo è possibile ottenere questo errore, e vogliono solo per documentare qui. Stavo collegando una libreria statica che non aveva RTTI. Quindi, utilizzando il flag C++ -fno-rtti risolto per me. Se non hai bisogno di RTTI, puoi usare anche questo flag. Spero che questo ti aiuti.

Problemi correlati