Oppure

Loading
17/06/17 18:55
TheDarkJuster
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:
[ 98%] Linking CXX executable ../../bin/compiler
../../lib/libSeaDragon.so: undefined reference to `vtable for SeaDragon::Development::AST::ExpressionFunction'
collect2: error: ld returned 1 exit status
src/compiler/CMakeFiles/compiler.dir/build.make:105: recipe for target 'bin/compiler' failed
make[3]: *** [bin/compiler] Error 1
CMakeFiles/Makefile2:447: recipe for target 'src/compiler/CMakeFiles/compiler.dir/all' failed
make[2]: *** [src/compiler/CMakeFiles/compiler.dir/all] Error 2
CMakeFiles/Makefile2:459: recipe for target 'src/compiler/CMakeFiles/compiler.dir/rule' failed
make[1]: *** [src/compiler/CMakeFiles/compiler.dir/rule] Error 2
Makefile:220: recipe for target 'compiler' failed
make: *** [compiler] Error 2


La classe ExpressionFunction eredita da Expression, e sono così definite:
           class Expression {
            public:
                Expression();
                Expression(std::vector<Token> &tkList);
                virtual void GenerateCode();
                virtual ~Expression();
            };


           class ExpressionFunction : public Expression {

            using Expression::Expression;

            public:
                ExpressionFunction(std::vector<Token> &tkList);
                virtual void GenerateCode();
                virtual ~ExpressionFunction();
            };


e per entrambe ho dichiarato ogni funzione/costruttore:
ExpressionFunction::ExpressionFunction(std::vector<Token> &tkList) {

}

ExpressionFunction::~ExpressionFunction() {

}

Expression::Expression() {
    throw Exception((const char *)"Unimplemented");
}

Expression::Expression(std::vector<Token> &tkList) {
    throw Exception((const char *)"Unimplemented");
}

void Expression::GenerateCode() {
    throw Exception((const char *)"Unimplemented");
}

Expression::~Expression() {

}


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

P.S. l'errore in fase di link è lo stesso sia usando il linker di llvm sia ld
Ultima modifica effettuata da TheDarkJuster 17/06/17 19:03
aaa
17/06/17 19:07
TheDarkJuster
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.....
aaa
17/06/17 19:12
nessuno
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 17/06/17 19:13
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.