peterpa
Goto Top

C++ undefine reference to

Hallo,
bin hier langsam am verzweifeln ... vieleicht findet jemand den Fehler auf anhieb... Danke dafür schonmal...

Habe 3 Files:
infovertiefung.cpp
#include <stdio.h>
#include "TDate.h" 


int main(){

TDate test(123);
printf("hallo welt\n");  
int a = test.getday();
cout << a << endl;

}

TDate.cpp
#include "TDate.h" 


int day;


int testit(){
cout << "hmm" << endl;  
}

int TDate::getday(){
	return day;
}

und TDate.h
#ifndef TDATE_H
#define TDATE_H

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <time.h>

using namespace std;

class TDate {
public:
	TDate(){};
	TDate(int a):day(a) {};
	int getday();
	void testit();
//	int getmonth();
//	int getyear();
//	string getstring();
//	void print();
//	void tprint();
//private:
	time_t time;
	int day;

};

#endif {{comment_single_line_double_slash:6}}

Wenn ich compiliere (ob mit oder ohne makefile) kommt die Fehlermeldung:
infovertiefung.cppface-sad.text+0x2b): undefined reference to `TDate::getday()'
collect2: ld gab 1 als Ende-Status zurück
make: *** [output] Fehler 1


Meines erachtens heißt das doch, dass TDate::getday() nicht deklariert ist ... aber ist sie doch oder übersehe ich das offensichtliche?!


P.S. Ja der Code ist furchtbar aber Kosmetik kommt dann wenn es funktioniert ....

Content-ID: 334434

Url: https://administrator.de/contentid/334434

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

Alchimedes
Alchimedes 07.04.2017 aktualisiert um 18:23:26 Uhr
Goto Top
Hallo,

meine C++ Kentnisse sind schon eingerostet, aber muss es nicht #include <TDate.h> heissen ? Du schreibst es in " " ?

und dann #ifndef TDATE_H das soll doch bestimmt #define heissen ??

Gruss
peterpa
peterpa 07.04.2017 um 18:34:40 Uhr
Goto Top
Ne das ist alles soweit ok ... kann zB auf die Variable day von der Klasse zugreifen... es muss was mit der Funktion zutun haben...

Aber danke.
Alchimedes
Alchimedes 07.04.2017 um 18:58:44 Uhr
Goto Top
Jo, hab grade mal unter gcc geschaut, tatsaechlich gibt es das mit Gaensefuesschen und #indef auch.

Krass...

Danke
Alchimedes
Alchimedes 07.04.2017 um 19:40:56 Uhr
Goto Top
Also ich hab mal Deinen Code kopiert und als .cc Dateien gespeichert um mit gcc oder g++ die Dateien zu compilieren.

Dabei kommt dann solche Fehlermeldung:

TDate.cc:9:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^

Ich hab mal diverse andere Programme genommen da geht alles perfekt.

Gruss
peterpa
peterpa 08.04.2017 aktualisiert um 11:18:58 Uhr
Goto Top
Also ich hab mal Deinen Code kopiert und als .cc Dateien gespeichert um mit gcc oder g++ die Dateien zu compilieren.

Danke für die Mühe!
Aber das wirft ja eher neue Fragen auf ... D.h. mein Compiler hat nen Knacks?!

Weiß jemand was das sein kann? Bzw ob das geht ... zumal ich auf Linux progge da ist der gcc ja implementiert -> So ein Fehler ist dann eigentlich ungewöhnlich?
Was die Fehlermeldung an sich im nachhinein auch vermuten lässt... wenn er in der main keine Referenz zu "TDate::getday()" findet aber weiß das es "TDate::" gibt ...

Werde heute mal versuchen den Compiler neu zu installieren...

TDate.cc:9:1: warning: control reaches end of non-void function [-Wreturn-type]}

Heißt ja glaube ich nur das die aus der Typsicherheit von C++ resultierende Typ int von main ein return haben will ...
Alchimedes
Alchimedes 08.04.2017 um 15:07:31 Uhr
Goto Top
Hallo,

ich progge hier auf ner mac moehre und der versucht hier ueber xcode zu compilieren und das obwohl ich es mit gcc oder g++
versuche.

So bekomme ich dann mit gcc -v -Wall infovertiefung.cc -o infovertiefung folgende Fehlermeldung:

Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Wie gesagt bei anderen Programmen geht es ohne Probleme.

Werde das mal meinem Raspberry probieren.
Gruss
peterpa
peterpa 12.04.2017 um 16:44:08 Uhr
Goto Top
*Push* Niemand eine Idee?
Mooswitz
Mooswitz 20.04.2017 um 16:40:30 Uhr
Goto Top
Ich habe deine Dateien mal angepasst... So wie ich es schreiben würde...

//filename tdate.h

#ifndef _TDATE_H_
#define _TDATE_H_

#include <iostream>
//#include <stdio.h>
#include <string.h>
#include <time.h>

using namespace std;

class TDate {
	public:
			TDate();//{}<- entfernt
			~TDate();//Destruktor fehlte
			TDate(int a):day(a){};//{}<-entfernt
			int getday(int);
			void testit();
		//	int getmonth();
		//	int getyear();
		//	string getstring();
		//	void print();
		//	void tprint();
	private://Variablen ruhig Privatisieren
			time_t time;
			int day;

};

#endif

//filename: tdate.cpp
#include "tdate.h" 

TDate::TDate()//Konstruktor Definieren
{
}

TDate::~TDate()//Destruktor Definieren
{
}

void TDate::testit(){//Klassenname fehlte, außerdem ist es void und nicht int
cout << "hmm" << endl;  
}

int TDate::getday(int day){
	return day;
}

//filename: infovertiefung.cpp
#include <stdio.h>
#include "tdate.h" 


int main(){

TDate test;
printf("hallo welt\n");  
int a = test.getday(123);
test.testit();
cout << a << endl;

}

So lässt es sich bei mir (gcc unter windows) compilieren.

Grüße, Mooswitz
peterpa
peterpa 21.04.2017 um 09:33:27 Uhr
Goto Top
Unter Windows bekomme ich es auch zum laufen...

Also ist nicht mehr unbedingt notwendig es zum laufen zu bekommen, aber interessant finde ich es trotzdem woran das liegt...

(Die Fehler wie zB. fehlender Klassennamen bei testit waren ja gewollt, damit ich sehen kann wo es hapert...)

Ich habe es auch schon mit "richtiger" Syntax versucht... Windows geht Linux nicht - Komisch! :/