undefined reference und Grundsätzliches
-
Erstmal die Sache mit den undefinierten Referenzen:
Ich hab eine SDL Anwendung die auf einem Template von NEHE basiert.
folgende Änderungen habe ich gemacht:
#include "GL_SDL_UI/TUIManager.h" #include "drawCode.h" int drawGLScene( TUIManager uimanager ) { [...] callDrawCode(uimanager); //#2 [...] }; int main(int argc, char **argv) { [...] TUIManager uimanager = TUIManager(); //#1 [...] drawGLScene( uimanager ); };Und die drawCode.h enthält 2 Funktionen inclusive Implementation.
An #1 sagt der compiler: "undefined reference to TUIManager::TUIManager()"
An #2 sagt der compiler: "undefined reference to TUIManager::~TUIManager()"Was mach ich falsch?
Eine Grundsätzliche Frage noch dazu:
Wie binde ich Funktionen (Nicht Klassen!) aus anderen Codefiles ein? Über include ich weiß, aber brauch ich dafür immer Headerfiles oder kann ich auch die *.cpp einbinden? Oder is es taktisch besser den Code direkt in den Headerfiles zu implementieren? (So wie ichs hier gemacht hab?)
-
TUIManager uimanager; // so :warning:eine kopie an drawGLScene zu übergeben ist nicht ratsam, entweder by ref oder per pointer
grundsätzlich:
nur header includieren, und src files mitcompilieren
-
Also das ändert mal spontan gar nichts an der Fehlermeldung.
-
Dein konstruktor und destruktor
TUIManager()
~TUIManager()haben keine implementierungen, bzw. der linker findet sie nicht.
das sagt die fehlermeldung. sprich: der "körper" der funktion fehlt oder ist nicht gefunden. du kündigst ihm durch die klasse diesen durch die funktionsdeklarationen an.
zum unteren punkt: nur header includieren. klassen in headerfiles, implementierungen in .cpp files.
und vielleicht vor nehe noch ein tutorial lesen zur programmierung allgemein.
-
Hmmm...Ich arbeite mit einer IDE (Eclipse) und hatte da das Verzeichnis als Suchpfad eingestellt welches dann das Verzeichnis GL_SDL_UI/ enthält. Dort lagen dann erst die Dateien. Ich hab per inlcude den Header richtig eingebunden (#include GL_SDL_UI/TUIManager.h) und bin davon ausgegangen (aus Delphi bin ich gewohnt, dass es nur eine Datei gibt, und ansonsten die IDE sowas managed) das alles gefunden wird.
Habe jetzt den Suchpfad direkt dort hingelegt, wo die Datein liegen. Allerdings kommt immer noch der Fehler, was ich nicht nachvollziehen kann. In den Suchpfaden steht exact der Pfad wo die TUIManager.cpp liegt. Und im Projekt includiere ich TUIManager.h . Also was muss ich denn nu noch machen? Kommt der Compiler nicht auf die Idee mal nach ner cpp zu suchen die den selben Namen trägt?<edit>Noch was zum Linker. Nach was sucht der eigentlich genau (Vermutlich *.o )? Ich hab beim Linker auch mal das Verzeichnis eingestellt, aber das hat auch nix gebracht. Wenn jemand erfahrung mit CDT hat, wär ich dem sehr dankbar, wenn er mir auf die Sprünge helfen kann.</edit>
Das mit den Klassen und der Aufteilung ist mir klar. Ich will wissen, wie ich das mache, wenn ich ein File hab wo nur paar Funktionen drinnen stehen sollen. Also keine Klasse ausen rum. Implementiert man die gleich im Header, oder includiert man direkt die cpp oder macht mans so kompliziert und macht auch dann header und Codefile getrennt?
-
KFlash schrieb:
Also was muss ich denn nu noch machen?
du musst sie mit kompilieren.
KFlash schrieb:
Kommt der Compiler nicht auf die Idee mal nach ner cpp zu suchen die den selben Namen trägt?
ne
KFlash schrieb:
Das mit den Klassen und der Aufteilung ist mir klar. Ich will wissen, wie ich das mache, wenn ich ein File hab wo nur paar Funktionen drinnen stehen sollen. Also keine Klasse ausen rum. Implementiert man die gleich im Header, oder includiert man direkt die cpp oder macht mans so kompliziert und macht auch dann header und Codefile getrennt?
imho grösstenteils ansichtssache.
aber einige dinge sind schon zu beachten wie "bedingte kompilierung" usw...
-
miller_m schrieb:
KFlash schrieb:
Also was muss ich denn nu noch machen?
du musst sie mit kompilieren.
KFlash schrieb:
Kommt der Compiler nicht auf die Idee mal nach ner cpp zu suchen die den selben Namen trägt?
ne
Oh...das is hart...hm...stellt sich mir nun die Frage, wie ich die mitcompiliere...
Ich hab hier ein "Managed Make Projekt" wem das was sagt. Ich schätze solche einstellungen gehören ins makefile oder? Also codefiles die mit kompiliert werden sollen....
hmmm mal sehn...
-
jep, gehören mit ins makefile. allerdings kann ich dir nicht sagen wie du dieses mit ecplise machst, da ich meine makefiles in der regel selber schreibe.