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-Key: 334434

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

Printed on: April 23, 2024 at 21:04 o'clock

Member: Alchimedes
Alchimedes Apr 07, 2017 updated at 16:23:26 (UTC)
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
Member: peterpa
peterpa Apr 07, 2017 at 16:34:40 (UTC)
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.
Member: Alchimedes
Alchimedes Apr 07, 2017 at 16:58:44 (UTC)
Goto Top
Jo, hab grade mal unter gcc geschaut, tatsaechlich gibt es das mit Gaensefuesschen und #indef auch.

Krass...

Danke
Member: Alchimedes
Alchimedes Apr 07, 2017 at 17:40:56 (UTC)
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
Member: peterpa
peterpa Apr 08, 2017 updated at 09:18:58 (UTC)
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 ...
Member: Alchimedes
Alchimedes Apr 08, 2017 at 13:07:31 (UTC)
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
Member: peterpa
peterpa Apr 12, 2017 at 14:44:08 (UTC)
Goto Top
*Push* Niemand eine Idee?
Member: Mooswitz
Mooswitz Apr 20, 2017 at 14:40:30 (UTC)
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
Member: peterpa
peterpa Apr 21, 2017 at 07:33:27 (UTC)
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! :/