PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ mit Kdevelop


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

Exxtreme
2011-10-10, 15:54:11
Sieht für mich ziemlich korrekt aus. Kann also ein Linker-Problem sein.


Ach ja, mach mal in der main()-Funktion am Ende ein:

delete m2;

rein. Ansonsten produzierst du ein Speicherleck. ;)


Edit: Ich könnte mir vorstellen, dass er sich an der Umwandlung enum -> bool stört. Du hast in der Methode "erzeuge()" hinten ein bool drinne während du die Variable Geschlecht als enum definiert hast. Enum kann mehr Werte haben als wahr oder falsch.

Trap
2011-10-10, 15:55:35
mensch.cpp wird nicht compiliert und nicht gelinkt.

anakin87
2011-10-10, 16:23:25
Ok ich hätts doch da reinstellen sollen, thx

@Exxtreme
Ups der Klassiker - klar kommt da nochn "delete m2;" rein ;)
Dass enum mit bool verbunden wurde sehe ich auch etwas kritisch - aber so stands im Tutorial, werd es dann noch rausgeben. Es hat schon andere Probleme gebracht als ich das ganze mal erweitert hab..

@Trap
ok soweit so klar nur wie löse ich das in Kdevelop?
Ich werd das Gefühl nicht los, dass es etwas mit dem Buildset zu tun hat, da da nur main.cpp erscheint und mensch.cpp mMn da auch rein sollte.

Per CLI gehts so...

g++ -o test main.cpp mensch.cpp

Gast
2011-10-11, 11:00:42
[...]

@Trap
ok soweit so klar nur wie löse ich das in Kdevelop?
Ich werd das Gefühl nicht los, dass es etwas mit dem Buildset zu tun hat, da da nur main.cpp erscheint und mensch.cpp mMn da auch rein sollte.

Ich kenn KDevelop jetzt nicht so genau aber da gibts doch sicher sowas wie "Datei zum Projekt hinzufügen" o.ä.

anakin87
2011-10-11, 12:50:16
Hehe, nach gefühlten 10h try & error hab ichs. ;D
Der Source war von Haus aus beim Projekt, nur wurden sie nicht in den Build übernommen....
Aber da gibts es eine kleine Datei CMakeLists.txt und da liegt der Hund begraben - unter add_executable() wird Binaryname und die SourceFiles angegeben; wobei main.cpp angeführt wurde und mensch.cpp eben nicht

#OLD
project(mustermensch)

add_executable(mustermensch main.cpp)

#NEW
project(mustermensch)

add_executable(mustermensch main.cpp mensch.cpp)

Gast
2011-10-11, 23:09:37
Hehe, nach gefühlten 10h try & error hab ichs. ;D
Der Source war von Haus aus beim Projekt, nur wurden sie nicht in den Build übernommen....
Aber da gibts es eine kleine Datei CMakeLists.txt und da liegt der Hund begraben - unter add_executable() wird Binaryname und die SourceFiles angegeben; wobei main.cpp angeführt wurde und mensch.cpp eben nicht

#OLD
project(mustermensch)

add_executable(mustermensch main.cpp)

#NEW
project(mustermensch)

add_executable(mustermensch main.cpp mensch.cpp)

IMO sollte genau das "Datei zum Projekt hinzufügen" automatisch machen. Oder muss man bei KDevelop echt selber cmakefiles schreiben?

p.s: Das alles findet man übrigens mit 5min suchen auf der KDevelop Homepage:
http://userbase.kde.org/KDevelop4/Manual/Getting_started:_A_small_CMake_tutorial

anakin87
2011-10-12, 12:07:39
Ja hast Recht, nur da musst mal drauf kommen. Ich mein in der IDE war der Source sichtlich zum Projekt hinzugefügt - nur das cmake ist halt etwas neu für mich und deshalb wusste ich nicht wonach ich suchen musste ;)
Blöd is nur, dass ich schon auf eben dieser Seite war und es nicht fand ;D

@all thx, sollt sich jetzt erledigt haben