C++ "Undefined reference" auf Library in workspace (eclipse)

Esteba

Lt. Junior Grade
Registriert
März 2013
Beiträge
310
Hallo allerseits,

Ich nutze die (relativ unbekannte) Core Media Library um mal ein bisschen in die hobbymäßige Spieleentwicklung einzusteigen. Mit Dev-C++ habe ich schon ein bisschen etwas auf die Beine gestellt, nun wollte ich (aus naheliegenden Gründen) in eclipse wechseln. Den C++-Compiler einzubinden war schon schwierig genug, nun habe ich eben ein Problem mit der Core Media Library: Bei sämtlichen Funktionsaufrufen sagt er mir "undefined reference".

Ich habe die ganze Library einfach in den workspace kopiert, weil ich sie mit auf ein SVN-Repository hochladen wollte, deshalb keine Einbindung eines externen Pfades. Die wichtigste Header-Datei liegt unter "coremedia/cml.h", dementsprechend habe ich sie mit "#include <coremedia/cml.h>" eingebunden. Den Pfad scheint er auch zu finden, er meckert an der Stelle jedenfalls nicht. Warum kann er dann zum Beispiel "CML_InitVideo" nicht finden, obwohl das in "cml.h" mit "extern int CML_InitVideo(...);" definiert ist?

Ich vermute, dass das mit der CML gar nichts zu tun hat, sondern nur mal wieder eine der berüchtigten Macken von eclipse ist... Deswegen bringt es auch nichts, den kompletten Code zu posten. Wie gesagt, in Dev-C++ hat alles wunderbar funktioniert, wobei ich da die Library nicht im selben Verzeichnis hatte. Aber er scheint sie ja zu finden?
 
Normalerweise mußt du dem Linker noch verklickern, daß er gegen diese Library linken soll (normalerweise mit -lNameDerLib.lib).
 
Wozu brauch ich denn ein ".lib"-File, wenn im Header-File alles definiert ist? Hab jetzt keine ".lib"-Datei von der CML gefunden... Die wird halt eigentlich direkt für Dev-C++ installiert: Das Download-File ist im ".devpak"-Format was von Dev-C++ geöffnet werden kann und dann richtet er einem das alles ein, ohne dass man sich darum kümmern muss. Alles was ich jetzt gemacht habe ist die relevanten Ordner und Dateien aus dem "include"-Ordner von Dev-C++ in den workspace zu kopieren, eine ".lib" war nicht dabei...

Das dumme ist, dass es zu der Library auch null Informationen und Installationsanleitungen gibt, nur einige Beispielprojekte...
 
Esteba schrieb:
Wozu brauch ich denn ein ".lib"-File, wenn im Header-File alles definiert ist? Hab jetzt keine ".lib"-Datei von der CML gefunden... Die wird halt eigentlich direkt für Dev-C++ installiert: Das Download-File ist im ".devpak"-Format was von Dev-C++ geöffnet werden kann und dann richtet er einem das alles ein, ohne dass man sich darum kümmern muss. Alles was ich jetzt gemacht habe ist die relevanten Ordner und Dateien aus dem "include"-Ordner von Dev-C++ in den workspace zu kopieren, eine ".lib" war nicht dabei...

Das dumme ist, dass es zu der Library auch null Informationen und Installationsanleitungen gibt, nur einige Beispielprojekte...


Also wenn wirklich alles im Header definiert ist (was durchaus möglich ist ... es gibt viele Header-only libs), dann brauchst du natürlich nicht gegen eine .lib-Datei linken. In dem Fall weiß ich dann leider auch keinen Rat. :(
Ergänzung ()

Hmm, mußt du vielleicht irgend welche Präprozesser-defines definieren, weil sonst möglicherweise irgendwelche Definitionen in dem Header nicht erfolgen? Es kann ja sein, daß Teile in was ähnlichem wie

Code:
#if defined SOME_COMPILER_SWITCH
    // Wichtige Definitionen hier ...
#endif

geschachtelt sind.
 
Zuletzt bearbeitet:
Der Fehler klingt ganz stark danach, dass du die Library noch linken musst. Schau mal in die Header rein, dort siehst du ja ob die Implementierung mit drin steht oder nicht.

Edit: Ich hab das grad mal durchexerziert und die Lib ist KEINE header only library. Sprich, wie vermutet musst du sie mit linken. In Linux müsstest du (falls du gcc verwendest) einfach noch ein "-lcml" mitgeben. Wie man das in Windows mit was weiß ich welchem Compiler macht musst du selbst herausfinden.

Die Header liegen unter "<Dev-Cpp-Installdir>\include\coremedia"
die eigentliche Lib unter "<Dev-Cpp-Installdir>\lib" und heißt libcml.a
 
Zuletzt bearbeitet:
Danke für die Hilfe. Das Problem hat sich erledigt, weil ich schließlich auf ein anderes Framework (SFML) umgestiegen bin. Das musste ich dann natürlich auch linken, wie von euch beschrieben. eclipse treibt einen da echt in den Wahnsinn, selbst wenn scheinbar alles richtig eingestellt ist, werden die Klassen teilweise noch nicht gefunden. Habe es nach viel Rumgefriemel aber schließlich hinbekommen... Fazit des ganzen: C++ programmieren in eclipse ist was für Masochisten!
 
Kanibal schrieb:
C++ programmieren ist generell was für Masochisten ;-) *hidez*
Und was würdest du vorziehen? Wie gesagt möchte ich Spiele programmieren. So sehr ich Java mag, für Spiele ist das einfach nix. Man muss sich nur angucken, was Minecraft an Ressourcen zieht, selbst bei pixeligsten Texturen.
 
Ich tippe mal, dass kein Spiel, was man irgendwie im Hobby-Bereich programmiert, seine Grenzen am Interpreter findet.
Das Problem bei Minecraft liegt woanders: stell dir mal vor, wie viele Zehntausend Blöcke der im Arbeitsspeicher behalten darf, wie viel komplizierter das Raytracing bei Blöcken gegenüber runden Oberflächen ausfällt, usw.

Für Dein Spiel könntest Du also auch beruhigt zu Java oder ähnlichem greifen. Falls es dann wirklich einen Performance-Engpass gibt, den Du nicht mehr wegoptimieren kannst, kannst Du immer noch wechseln - sofern das Konzept steht, geht die spezifische Implementierung recht schnell.
 
Zurück
Oben