anakin87
2011-10-10, 15:37:21
Hallo Leute,
ich probiere gerade verschiedene IDEs unter Linux um C++ zu lernen. So und nun habe ich ein kleines Problem mit Kdevelop (4.2.3.) Ich schätze mal da passt was nicht mitn Linker weil der Code sollte OK (Tutorial-Code) sein.
der Fehler:
Scanning dependencies of target mustermensch
[100%] Building CXX object CMakeFiles/mustermensch.dir/main.cpp.o
Linking CXX executable mustermensch
CMakeFiles/mustermensch.dir/main.cpp.o: In function `main':
blabla main.cpp:6: undefined reference to 'Mensch::erzeuge(char const*, unsigned int, bool)'
blabla main.cpp:8: undefined reference to 'Mensch::erzeuge(char const*, unsigned int, bool)'
blabla main.cpp:10: undefined reference to 'Mensch::print()'
blabla main.cpp:12: undefined reference to 'Mensch::print()'
collect2: ld returned 1 exit status
make[2]: *** [mustermensch] Error 1
make[1]: *** [CMakeFiles/mustermensch.dir/all] Error 2
make: *** [all] Error 2
*** Failed ***
Ich wollte einfach weitere Fehlerquellen ausschließen, darum das Tutorial - das muss doch irgendwie laufen :biggrin:
EDIT: hm unter Eclipse läuft es anstandslos
aber per CLI mit g++ weigert es sich auch...
Makefile Probleme?
Irgendwo Linker einstellen? Wenn ja, wo? bzw. wie hat Eclipse das selbst erkannt?
Irgendwie bin ich zu verwöhnt von VisualStudio (etwas C# Erfahrung) da sind die Sachen nicht so verbaut wie in Kdevelop - sieht etwas unübersichtlich aus :(
der Sourcecode:
main.cpp
#include "mensch.h"
int main(void) {
Mensch m1;
Mensch* m2 = new Mensch;
m1.erzeuge("Adam",33,Mensch::MANN);
m2->erzeuge("Eva",31,Mensch::FRAU);
m1.print();
m2->print();
return 0;
}
mensch.h
// mensch.h
#include <iostream>
#ifndef _MENSCH_H_
#define _MENSCH_H_
using namespace std;
class Mensch {
public:
enum Geschlecht { MANN, FRAU };
private:
// Eigenschaften der Klasse Mensch
char name[30];
unsigned int alter;
bool geschlecht;
//0 = männlich; 1 = weiblich
void test_geschlecht( void );
public:
// Fähigkeiten (Methoden) der Klasse Mensch
void sehen( const char* objekt );
void hoeren( const char* geraeusch );
void riechen( const char* geruch );
void schmecken( const char* geschmack );
void tasten( const char* objekt );
// Einen Menschen mit allen Daten erzeugen ggf. Überladen
void erzeuge( const char* n = "Unbekannt",
unsigned int a = 0,
bool g = FRAU );
void print( void );
};
#endif
mensch.cpp
// mensch.cpp
#include <iostream>
#include <cstring>
#include "mensch.h"
using namespace std;
// Hier beginnen die Definitionen der Klassenmethoden
void Mensch::erzeuge(const char* n, unsigned int a,bool g) {
// Hier könnten/sollten die übergebenen Parameter
// überprüft werden, bevor diese verwendet werden
strncpy( name, n, sizeof(name)-1 );
name[sizeof(name)] = '\0';
alter = a;
geschlecht = g;
}
void Mensch::print ( void ) {
cout << name << " " << alter << " Jahre (";
test_geschlecht();
cout << ")\n";
}
void Mensch::test_geschlecht( void ) {
if( geschlecht == FRAU ) {
cout << "weiblich";
}
else {
cout << "männlich";
}
}
void Mensch::sehen( const char* objekt ) {
cout << name << " sieht " << objekt << '\n';
}
void Mensch::hoeren( const char* geraeusch ) {
cout << name << " hört " << geraeusch << '\n';
}
void Mensch::riechen( const char* geruch ) {
cout << name << " riecht " << geruch << '\n';
}
void Mensch::schmecken( const char* geschmack ) {
cout << name << " schmeckt " << geschmack << '\n';
}
void Mensch::tasten( const char* objekt ) {
cout << name << " nimmt " << objekt << '\n';
}
So und nun hoffe ich ihr könnt mir weiterhelfen...
beste Grüße Anakin87
BTW: ich war mir nicht sicher ob es nicht doch unter Programmierung rein sollte - wenn ja bitte verschieben, thx
ich probiere gerade verschiedene IDEs unter Linux um C++ zu lernen. So und nun habe ich ein kleines Problem mit Kdevelop (4.2.3.) Ich schätze mal da passt was nicht mitn Linker weil der Code sollte OK (Tutorial-Code) sein.
der Fehler:
Scanning dependencies of target mustermensch
[100%] Building CXX object CMakeFiles/mustermensch.dir/main.cpp.o
Linking CXX executable mustermensch
CMakeFiles/mustermensch.dir/main.cpp.o: In function `main':
blabla main.cpp:6: undefined reference to 'Mensch::erzeuge(char const*, unsigned int, bool)'
blabla main.cpp:8: undefined reference to 'Mensch::erzeuge(char const*, unsigned int, bool)'
blabla main.cpp:10: undefined reference to 'Mensch::print()'
blabla main.cpp:12: undefined reference to 'Mensch::print()'
collect2: ld returned 1 exit status
make[2]: *** [mustermensch] Error 1
make[1]: *** [CMakeFiles/mustermensch.dir/all] Error 2
make: *** [all] Error 2
*** Failed ***
Ich wollte einfach weitere Fehlerquellen ausschließen, darum das Tutorial - das muss doch irgendwie laufen :biggrin:
EDIT: hm unter Eclipse läuft es anstandslos
aber per CLI mit g++ weigert es sich auch...
Makefile Probleme?
Irgendwo Linker einstellen? Wenn ja, wo? bzw. wie hat Eclipse das selbst erkannt?
Irgendwie bin ich zu verwöhnt von VisualStudio (etwas C# Erfahrung) da sind die Sachen nicht so verbaut wie in Kdevelop - sieht etwas unübersichtlich aus :(
der Sourcecode:
main.cpp
#include "mensch.h"
int main(void) {
Mensch m1;
Mensch* m2 = new Mensch;
m1.erzeuge("Adam",33,Mensch::MANN);
m2->erzeuge("Eva",31,Mensch::FRAU);
m1.print();
m2->print();
return 0;
}
mensch.h
// mensch.h
#include <iostream>
#ifndef _MENSCH_H_
#define _MENSCH_H_
using namespace std;
class Mensch {
public:
enum Geschlecht { MANN, FRAU };
private:
// Eigenschaften der Klasse Mensch
char name[30];
unsigned int alter;
bool geschlecht;
//0 = männlich; 1 = weiblich
void test_geschlecht( void );
public:
// Fähigkeiten (Methoden) der Klasse Mensch
void sehen( const char* objekt );
void hoeren( const char* geraeusch );
void riechen( const char* geruch );
void schmecken( const char* geschmack );
void tasten( const char* objekt );
// Einen Menschen mit allen Daten erzeugen ggf. Überladen
void erzeuge( const char* n = "Unbekannt",
unsigned int a = 0,
bool g = FRAU );
void print( void );
};
#endif
mensch.cpp
// mensch.cpp
#include <iostream>
#include <cstring>
#include "mensch.h"
using namespace std;
// Hier beginnen die Definitionen der Klassenmethoden
void Mensch::erzeuge(const char* n, unsigned int a,bool g) {
// Hier könnten/sollten die übergebenen Parameter
// überprüft werden, bevor diese verwendet werden
strncpy( name, n, sizeof(name)-1 );
name[sizeof(name)] = '\0';
alter = a;
geschlecht = g;
}
void Mensch::print ( void ) {
cout << name << " " << alter << " Jahre (";
test_geschlecht();
cout << ")\n";
}
void Mensch::test_geschlecht( void ) {
if( geschlecht == FRAU ) {
cout << "weiblich";
}
else {
cout << "männlich";
}
}
void Mensch::sehen( const char* objekt ) {
cout << name << " sieht " << objekt << '\n';
}
void Mensch::hoeren( const char* geraeusch ) {
cout << name << " hört " << geraeusch << '\n';
}
void Mensch::riechen( const char* geruch ) {
cout << name << " riecht " << geruch << '\n';
}
void Mensch::schmecken( const char* geschmack ) {
cout << name << " schmeckt " << geschmack << '\n';
}
void Mensch::tasten( const char* objekt ) {
cout << name << " nimmt " << objekt << '\n';
}
So und nun hoffe ich ihr könnt mir weiterhelfen...
beste Grüße Anakin87
BTW: ich war mir nicht sicher ob es nicht doch unter Programmierung rein sollte - wenn ja bitte verschieben, thx