Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - undefined reference to vtable
Forum - C/C++ - undefined reference to vtable

Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:55
Sabato, 17/06/2017
Buona sera, ho un progetto (molto bizzarro) che punta a diventare un frontend per llvm di un linguaggio molto strano.

Al momento ho un lexer funzionante, e mi accingo a scrivere il parser, solo che vengo bloccato da un errore in false di linking:
Codice sorgente - presumibilmente VB.NET

  1. [ 98%] Linking CXX executable ../../bin/compiler
  2. ../../lib/libSeaDragon.so: undefined reference to `vtable for SeaDragon::Development::AST::ExpressionFunction'
  3. collect2: error: ld returned 1 exit status
  4. src/compiler/CMakeFiles/compiler.dir/build.make:105: recipe for target 'bin/compiler' failed
  5. make[3]: *** [bin/compiler] Error 1
  6. CMakeFiles/Makefile2:447: recipe for target 'src/compiler/CMakeFiles/compiler.dir/all' failed
  7. make[2]: *** [src/compiler/CMakeFiles/compiler.dir/all] Error 2
  8. CMakeFiles/Makefile2:459: recipe for target 'src/compiler/CMakeFiles/compiler.dir/rule' failed
  9. make[1]: *** [src/compiler/CMakeFiles/compiler.dir/rule] Error 2
  10. Makefile:220: recipe for target 'compiler' failed
  11. make: *** [compiler] Error 2



La classe ExpressionFunction eredita da Expression, e sono così definite:
Codice sorgente - presumibilmente C++

  1. class Expression {
  2.             public:
  3.                 Expression();
  4.                 Expression(std::vector<Token> &tkList);
  5.                 virtual void GenerateCode();
  6.                 virtual ~Expression();
  7.             };
  8.  
  9.  
  10.            class ExpressionFunction : public Expression {
  11.  
  12.             using Expression::Expression;
  13.  
  14.             public:
  15.                 ExpressionFunction(std::vector<Token> &tkList);
  16.                 virtual void GenerateCode();
  17.                 virtual ~ExpressionFunction();
  18.             };



e per entrambe ho dichiarato ogni funzione/costruttore:
Codice sorgente - presumibilmente C++

  1. ExpressionFunction::ExpressionFunction(std::vector<Token> &tkList) {
  2.  
  3. }
  4.  
  5. ExpressionFunction::~ExpressionFunction() {
  6.  
  7. }
  8.  
  9. Expression::Expression() {
  10.     throw Exception((const char *)"Unimplemented");
  11. }
  12.  
  13. Expression::Expression(std::vector<Token> &tkList) {
  14.     throw Exception((const char *)"Unimplemented");
  15. }
  16.  
  17. void Expression::GenerateCode() {
  18.     throw Exception((const char *)"Unimplemented");
  19. }
  20.  
  21. Expression::~Expression() {
  22.  
  23. }



Cosa puo' causare quell'orrore in fase di linking? Trovate il sorgente completo a questo indirizzo: https://github.com/NeroReflex/SeaDragon

P.S. l'errore in fase di link è lo stesso sia usando il linker di llvm sia ld

Ultima modifica effettuata da TheDarkJuster il 17/06/2017 alle 21:03
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1452
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 21:07
Sabato, 17/06/2017
Aehm........ Ho appena scoperto che ho tralasciato la dichiarazione di ExpressionFunction::GenerateCode() ovviamente lo scopro solo dopo avr postato, e non quando ho controllato se avevo dimenticato corpi di funzioni.....

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:12
Sabato, 17/06/2017
Mi pare che manchi la GenerateCode della classe ExpressionFunction


OOPS ... te ne sei accorto ... In genere la causa di quell'errore è la dimenticanza del codice del distruttore virtual ...

Ultima modifica effettuata da nessuno il 17/06/2017 alle 21:13


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote