undefined reference



  • Ich habe mich mit extra für dieses kleine Projekt c++ beschäftigt, weiß jetzt was eine Klasse ist,
    wie man mittels Konsole unter linux kompiliert und linkt und kenne rudimentäre Funktionen von und g++/gcc. Aber ich kriege es nicht zum laufen.

    ich würde mich freuen wenn jemand von euch einen Tip hat wie man weiter vorgehen kann:

    Problem:
    Es liegt ein Package vor da ist unter anderem ein Hauptprogramm für bestimmte Optimierungsaufgaben dabei. Unter Dos mit Mingw lief das schon mal.

    Es existiert Quellcode der eigentlich fehlerfrei unter linux zu kompilieren und linken sein sollte.
    Allein aus den Quellcodes Objektcode zu kompilieren empfand ich Einsteiger als nicht ganz trivial.
    Es mussten einige Änderungen vorgenommen werden: (hab ellenlang im Netz nach lösungen gesucht..)
    ersetzen von khbit(), ersetzen von conio.h. durch ncurses.h usw..

    ich wollte folgendes linken:

    g++ traps.o trapslib.o trapsrep.o trapsind.o trapsmod.o jklib2.a nrc206.a
    
    da meckert g++: 
    traps.o: In function `SpecGenEvolve(_IO_FILE*, PORTFOLIO&)':
    traps.c:(.text+0x1f0): undefined reference to `GENOPT::GENOPT()'
    traps.c:(.text+0x203): undefined reference to `GENOPT::~GENOPT()'
    traps.c:(.text+0x2ab): undefined reference to `GENOPT::setup(long, long)'
    traps.c:(.text+0x2ba): undefined reference to `GENOPT::randomize(long)'
    usw...
    

    Auszug traps.c

    #include "../gopt103/genopt1.hpp"       // genetic optimizer header file
    
    ...
    
    void SpecGenEvolve (FILE *fil, PORTFOLIO &pf) {
    
        // Performs portfolio-wide genetic optimization for evolving
        // rules as done in S&C article by authors.
        // fil     - non-standard output file for optimization data
        // pf      - portfolio structure
    
        static float bprm[MAXPRM], *pfit;
        int gen, i, isdup, k, line;
        static GENOPT go;
        #define MINFIT (-999999.0)
    
        // set up genetic optimizer specific to problem to be solved
        fprintf(stdout,"Initializing genetic optimizer...\n");
        fflush(stdout);
        k = 12;             // parameter count for evolution
        go.setup(k, 15*k);  // set population 10 times parameter count
        go.randomize(1234);
        go.mutation und soweiter
    
    ...
    

    die genopt1.hpp

    // GENOPT1.HPP - Genetic optimizer component header file
    ...
    // May be used with 32-bit and 16-bit ANSI C++ compilers.
    
    #define GONORMAL	1
    #define GODIFFERENTIAL	2
    #define GOMINFIT 	(-1.0E32)
    
    class GENOPT {
    private:
        long    np;         // population size
        long    nv;         // vector size
        long    ng;         // generation count
        float   **v;        // population member vectors
        float   *f;         // population member fitnesses
        float   *vc;        // child vector
        float   cmf;        // child fitness
        float   crnt;       // current fitness
        float   *ub;        // upper scaling bounds
        float   *lb;        // lower scaling bounds
        float   bmf;        // best member fitness
        float   amf;        // average member fitness
        float   mr;         // mutation rate
        float   *mc;        // mutation creep
        float   cr;         // crossover rate
        long    chnk;       // chunk size for crossovers
        long    alg;	// evolutionary algorithm selector
        float   devf;	// differential evolution factor
        long    urs;        // rng internal
        long    rngiseed2;	// rng internal
        long    rngiy;	// rng internal
        long    rngiv[32];	// rng internal
    private:
        float rng(long &iseed);
        void randinit(long seed);
        float randflt(void);
        long randint(long n);
    public:
        GENOPT(void);
        ~GENOPT(void);
        long setup(long nvec, long npop);
        void clear(void);
        void scale(long k, float vmin, float vmax);
        void mutation(float mut) { mr=mut; };
        void creep(long k, float mutc) { mc[k]=mutc; };
        void crossover(float cross) { cr=cross; };
        void chunk(long k) { chnk=k; };
        void algorithm(long m) { alg=m; };
        void differential(float fac) { devf=fac; };
        void randomize(long seed);
        void receive_vector(float *vec);
        void send_fitness(float fit);
        float scale_ub(long k) { return ub[k]; };
        float scale_lb(long k) { return lb[k]; };
        float mutation(void) { return mr; };
        float creep(long k) { return mc[k]; };
        float crossover(void) { return cr; };
        long chunk(void) { return chnk; };
        long algorithm(void) { return alg; };
        float differential(void) { return devf; };
        float memberfitness(long k) { return f[k]; }
        float membervecelt(long k, long i);
        void mostfitvector(float *vec);
        float bestfitness(void) { return bmf; };
        float averagefitness(void) { return amf; };
        float currentfitness(void) { return crnt; };
        long generations(void) { return ng; };
        long population(void) { return np; };
        long vectorsize(void) { return nv; };
    };
    
    #endif /* QQ
    

    DANKE im Voraus
    S

    PS OS ist ein 64bit Debian



  • Jesus, was für ein elender Haufen mieser Dreckscode!

    Zunächst mal ist .c die falsche Endung für C++-Code.
    Die Fehlermeldungen kommen vom Linker, der die Definitionen der Memberfunktionen nicht finden kann. Die beiden Sourcefiles die du da gezeigt hast, haben auch rein gar nichts miteinander zu tun.

    Gibst du dem Compiler auch irgendwo ein C++-File zum kompilieren?



  • Da fehlt noch (mindestens) eine Bibliothek. Steht in der Doku nicht, welche Bibliotheken benötigt werden?

    Nach dem Kommentar
    // May be used with 32-bit and 16-bit ANSI C++ compilers.
    müsstest du eine 32-Bit Version bauen.

    Lars



  • Danke erstmal für die Hinweise - sind schon mal sehr hilfreich.

    Eigentlich sollte es doch keine Rolle spielen ob man

    lib1.a lib2.a lib3.a ...

    oder

    lib_die_alle_libs_in_einer_enthält.a

    einbindet?

    In der Doku (im Verzeichnis für DOS) steht

    das jedes Unterverzeichnis von /SCICON eine Bibliothek enthält. (liegen prebuild vor).
    Nun steht da das im Unterverzeichnis /TRAPS (wo sich auch der Code für das Hauptprogramm befindet eine merged.lib liegen soll, die den Code aus allen anderen Bibliotheken enthält. Diese ist bei dem Verzeichnis für DOS vorhanden - aber beim dem für Linux nicht.
    Nun dachte ich es sollte keinen Unteschied machen ob man die libs einzeln dazu linkt oder als merged.a, oder??

    Ich bin ein bisschen verwundert weil in der Doku steht:

    This version of the software compiles without errors using the
    GNU C++ compiler that is popular with Linux / Unix users.
    The GNU compiler suite is also available for Windows as part
    of MinGW and MSYS.

    Und ich meine das unter MinGW relativ einfach ist das Programm zu erstellen. Hatte ich vor ca einem Jahr ausprobiert..
    (mit den vorhandenen makefiles etc)


Anmelden zum Antworten