Compilerfehler: undefined reference to..
-
Ich kriege in einem Abscnitt meines Programm diese Fehler:
main.cpp
Fehler: undefined reference to anm::cTiming::cTiming()' Datei nicht gefunden: main.cpp main.cpp:-1: Fehler: undefined reference toanm::cTiming::initTiming()'
Datei nicht gefunden: main.cppusw.
Jedoch klappt der Code in einem anderen Abschnitt wunderbar. Wüßte einer woran es liegen könnte?
#include "./../../src/cTiming.h" .. cTiming *solve = new cTiming(); // Hier zeigt er bereits Fehler an solve->initTiming(); solve->startTiming(); Algorithmus.. solve->endTiming(); myfile << "solved in: "<<solve->getDuration()<< " sec" << endl; myfile.close(); cout << "solved in: "<<solve->getDuration()<< " sec" << endl; }
-
Das ist kein Compilerfehler, sondern ein Linkerfehler. Die Definitionen der fehlenden Methoden stehen anscheinend in einer anderen Übersetzungseinheit, die du deinem Projekt noch hinzu fügen musst. Wie das genau geht, kommt drauf an, mit welchen Werkzeugen du arbeitest.
Allgemein:
cTiming *solve = new cTiming();
Wieso nichtcTiming solve;
? * ``` solve->initTiming();Das klingt, als sollte diese Funktion ein Konstruktor der Klasse sein.
#include "./../../src/cTiming.h"
Solch lange Pfadangaben sind eher ungewöhnlich, da fehleranfällig. Besser wäre kein oder nur ein kurzer Pfad und stattdessen eine passende Einstellung bei der Übersetzung, von wo aus der Compiler nach includes suchen soll. * ``` " sec" << endl;Soll das wirklich
endlsein und nicht" sec\n"? Gerade bei Dateien macht das einen Unterschied.myfile.close();
Zwei Zeilen später geht deine Datei sowieso automatisch zu.
-
-
Also in der "cTiming.h" Datei stehen die Methoden drin, die ich aufrufen wollte. Das ganze verwirrt mich grad irgendwie ein bisschen, da dieser Code in einer anderen Klasse klappt. So sollte das doch eigentlich funktionieren?
cTiming solve;hmmm das ist nen Copy-Paste Code.. Wenn ich so darüber nachdenke wäre es garnicht nötig hier nen pointer auf einem Objekt zu machen. Lustigerweise zeigt er mit dem verwendeten Code keinen Fehler auf...
" sec" << endl;Yepp hier soll es nen \n werden.
solve->initTiming();Nah hier sollte das Objekt solve die Methode initTiming aufrufen
#ifndef CTIMING_H #define CTIMING_H #include <string> #include <iostream> #include <ctime> using namespace std; namespace anm { class cTiming { public: cTiming(); ~cTiming(); void initTiming(); void startTiming(); void endTiming(); double getDuration(); double getAktuell(); private: double duration; double delta_t; clock_t start_time; clock_t end_time; clock_t aktuell_time; }; }//namespace anm #endifHier ist noch der Code von der cTiming.cpp
#include "cTiming.h" namespace anm { cTiming::cTiming() { duration = 0.; delta_t = 0.; start_time = 0.; aktuell_time = 0.; } cTiming::~cTiming() { } void cTiming::initTiming() { this->duration = 0; } void cTiming::startTiming() { this->start_time = clock(); } void cTiming::endTiming() { this->end_time = clock(); this->delta_t = (double)(this->end_time-this->start_time)/CLOCKS_PER_SEC; this->duration += this->delta_t; } double cTiming::getDuration() { return(this->duration); } double cTiming::getAktuell() { this->end_time = clock(); this->delta_t = (double)(this->end_time-this->start_time)/CLOCKS_PER_SEC; this->start_time = clock(); this->duration += this->delta_t; return(this->duration); } }//namespace anm
-
binhbob schrieb:
Also in der "cTiming.h" Datei stehen die Methoden drin, die ich aufrufen wollte. Das ganze verwirrt mich grad irgendwie ein bisschen, da dieser Code in einer anderen Klasse klappt. So sollte das doch eigentlich funktionieren?
Nein. Headerdateien haben mit deinem Problem gar nichts zu tun. Und dass das anderswo funktioniert heißt nur, dass du es anderswo richtig gemacht hast. Der Code ist in Ordnung, du übersetzt falsch. Du hast keine Verbindung zwischen deiner cTiming.cpp und dem anderem Code.
solve->initTiming();Nah hier sollte das Objekt solve die Methode initTiming aufrufen
Dein Konstruktor setzt duration doch sowieso schon auf 0.
cTiming::~cTiming() { }Wozu soll das hier gut sein?
double delta_t;Wieso ist das ein Member der Klasse, wenn es bloß als lokaler Zwischenwert in einigen Funktionen benutzt wird? Gleiches gilt für end_time.
clock_t aktuell_time;current_time?
Stil: Sämtliche this-> kannst du dir sparen, dann wird der Code gleich viel lesbarer. Weiterhin ist ein c vor Klassennamen eher ungewöhnlich, da es keinen Mehrwert hat.
Ein kleine mögliche Verbesserung wäre noch, duration als clock_t zu speichern und nur bei Bedarf den Wert durch CLOCKS_PER_SEC zu teilen. Ist nicht wirklich wichtig, das ist nur etwas, was mir als Numeriker ins Auge fällt, da die andere Methode solider wäre.
-
Danke für die Antwort. Ich bin Quasi Neuling in c++. Komme von Java und muss mich in einem bestehenden Projekt einarbeiten. Konnte jetzt nun die cTiming.cpp einbinden und es läuft nun alles.
Cool das du Numeriker bist. Das hier war eine implementierung eines Adams-Bashforth Algorithmus. Leider ist das Ergebnis bis jetzt eher ernüchtern oder Fehlerhaft... Die Amplitude der SchwingungDGL nimmt immer zu...
-
binhbob schrieb:
Das hier war eine implementierung eines Adams-Bashforth Algorithmus. Leider ist das Ergebnis bis jetzt eher ernüchtern oder Fehlerhaft... Die Amplitude der SchwingungDGL nimmt immer zu...
Ich sehe nur eine Zeitmessung.