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 /* QQDANKE im Voraus
SPS 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)