• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Undefined Reference to ... [in-charge]

collix

Newbie
Hi,

habe schon einiges über dieses Thema im Internet gefunden, aber bisher hat mir nix geholfen:

Egal, welche externe Includes ich benutze (sei es id3lib oder KDE-APIs, mal abgesehen von KMainWidget und KApplication), beim kompilieren (gcc 3 und kdevelop 3) kommt beim Linken die Meldung

Code:
...
In line ... : Undefined reference to [in-charge]KFileMetaInfo::KFileMetaInfo(QString, int, QString)
...
...oder so ähnlich.

edit: KFileMetaInfo ist nur ein Beispiel!

Ich habe alles an devel-Packages installiert was ich finden konnte. Das Programm ist das KDE-Standardprojekt von KDevelop, und, wie gesagt, KMainWidget usw. laufen problemlos, auch der ganze QT-Kram. Es kommen auch keine Fehlermeldungen, dass ld die Header nicht gefunden hätte. Nichts. Nur dieser Mist.

Hat irgendjemand eine Idee? Mich kotzt das nämlich echt an...[/i]
 

oc2pus

Ultimate Guru
collix schrieb:
Egal, welche externe Includes ich benutze (sei es id3lib oder KDE-APIs, mal abgesehen von KMainWidget und KApplication), beim kompilieren (gcc 3 und kdevelop 3) kommt beim Linken die Meldung

Code:
...
In line ... : Undefined reference to [in-charge]KFileMetaInfo::KFileMetaInfo(QString, int, QString)
...
mal nur so zum Verständnis:
der compiler braucht Header (include-Dateien)
der linker braucht Bibliotheken (*.so, *.la,*.a, *.o Dateien)

und die Fehlermeldung von dir hat NICHTS mit Includes zu tun, der Linker findet nicht alle Bibliotheken ...

Abhilfe: LD_LIBRARY_PATH richtig setzen, bzw in deinem kdevelop-Projekt den Pfad zu den BIBLIOTHEKEN richtig setzen.

collix schrieb:
...oder so ähnlich.
und je genauer du eine Fehlermeldung wiedegibst, umso präziser kann man dir helfen ... Glaskugeln sind sehr sehr sehr teuer ...

collix schrieb:
Hat irgendjemand eine Idee? Mich kotzt das nämlich echt an...
Und dieses Halbwissen und dumm rum gemaule und gejammere, das kotzt mich immer an ;)
 
OP
C

collix

Newbie
Ja, sorry, nich böse sein (ist nur der erste Fehler wo mir keiner helfen konnte) :wink:

Vielen Dank für die Antwort, jetzt bin ich allerdings noch ein bisschen vewirrter als vorher:
Was für Bibliotheken sind das? Meinst du irgendeinen Objektcode von den KDE-APIs, der eingebunden werden muss - muss ich also in den Makefiles rumbasteln? Und warum funktioniert denn dann KApplication usw.?

Sebastian
 

TeXpert

Guru
nein, Du musst nicht explizit in den Makefiles rumbasteln, das macht kdevelop mit automake und co, wichtig ist, dass Du in den Projekteinstellungen die relevanten libs hinzufügst.

mit diesen 'geht nicht' Fragen darfst Du aber keine genaueren Antworten erwarten :)
 

taki

Advanced Hacker
U.U. doch in den Makefiles. Genaugenommen in der Datei Makefile.am, wenn es um konkreten Objektcode geht. Allerdings in diesem Fall eher nicht.

In der Source selbst darf der Include auf die entsprechende Headerdatei nicht fehlen. Hat mich als ziemlicher Anfänger ganz schön durcheinander gebracht: KDE-Objekte mit dem eingebetteten qdesigner eingebunden, aber beim Binden krachte es. Meistens fehlte mir der Include für die Headerdatei, in der die Basisklasse meines Objekts definiert war. Oder im eigenen Header fehlte die Foreward-Deklaration.
 
OP
C

collix

Newbie
Also, die Headerdateien habe ich ganz bestimmt eingebunden. Und mit dem richtigen Pfad zur Lib hab ich es sogar geschafft, TagLib in mein Projekt mit einzubinden. Aber mit den KDE-Controls hakt es immer noch. Habt ihr vielleicht ne Makedatei oder Compilereinstellung, die bei euch funktioniert, die ihr hier posten könnt? Dann würd' ich die mal mit meiner vergleichen...

P.S.: Seid mir nicht böse, wenn ich immer nur ungenaue Fehlermeldungen habe - aber mein Linuxrechner hat (leider) kein Internet und steht ein paar Kilometer entfernt - das einzige was ich hier habe ist mein Gedächtnis ;)

Aber danke schon mal für die Antworten
 

TeXpert

Guru
taki schrieb:
U.U. doch in den Makefiles. Genaugenommen in der Datei Makefile.am, wenn es um konkreten Objektcode geht. Allerdings in diesem Fall eher nicht.

mir ist noch kein Problem untergekommen, bei dem kdevelop3 Fehler in den automake-Definitionen erzeugt hat, wenn die Projekteinstellungen korrekt vorgenommen werden, werden die automake-Dateien auch richtig erzeugt (u.U. muss man die mal komplett neu erstellen lassen, aber sonst...)

Welche Probleme meinst Du?
 

taki

Advanced Hacker
Ich habe neulich die Datei Makefile.am angepasst, nachdem ich einen Dialog (.ui) hinzugefügt und eine Klasse davon abgeleitet hatte. Ohne dem konnte meine neue Klasse nicht übersetzt werden.

Wenn ich das aber richtig verstehe, war das gar nicht nötig. Man muss neue Sourcen nur korrekt beim automake-Manager anmelden. Dann werden die Einträge fürs Makefile.am generiert. Da ich das noch nicht wusste, waren die neuen Sourcen dem automake-Manager nicht bekannt.

Ich bin noch ein ziemlicher Anfänger mit kdevelop und überhaupt C++. Aber dafür finde ich, dass man mit diesem Tool schon erstaunlich schnell hinein findet.
 
OP
C

collix

Newbie
Also nochmal: Wenn ich beispielsweise das KLED-Lämpchen auf einem KMainWindow platzieren will, was brauche ich dann?

- ein #include <kled.h> (klar)
- in den g++-Flags ein -L/opt/kde3/lib oder -R/opt/kde3/lib (keine Ahnung!)
- und was noch? Hilfe! Warum findet der die KDE-Libs nich, steht doch überall! Und KApplication/KMainWindow funktioniert doch auch!

Sebastian
 

taki

Advanced Hacker
Geht es jetzt um einen anderen Fehler? In Deiner Fehlermeldung von neulich steht nichts von KLed.

collix schrieb:
Also nochmal: Wenn ich beispielsweise das KLED-Lämpchen auf einem KMainWindow platzieren will, was brauche ich dann?

- ein #include <kled.h> (klar)

...in der Source (*.cpp). Im Header sollte eine Vorwärtsdeklaration stehen.

Code:
class KLed;

Wenn hier was fehlt, dürfte aber schon das Compilieren scheitern, nicht erst das Binden. Da wird es hier m.E. nicht dran liegen.

collix schrieb:
- in den g++-Flags ein -L/opt/kde3/lib oder -R/opt/kde3/lib (keine Ahnung!)
- und was noch? Hilfe! Warum findet der die KDE-Libs nich, steht doch überall! Und KApplication/KMainWindow funktioniert doch auch!

Sebastian

Wenn Du mit einem Template von kdevelop angefangen hast, sollte das nicht nötig sein. Ist auch nicht sinnvoll, die Bibliotheken so einzubinden, weil Du so die Bibliotheken mit dem festen Pfad vorgibst.

automake verwendet eine Variable dafür. Die steht in der Datei Makefile.am.

Ich bin noch nicht lange genug dabei, um das sicher sagen zu können. Aber in der Makefile.am wird auch irgendwo angegeben, welche Bibliotheken eingebunden werden müssen. Dort muss ggf. noch was ergänzt werden. kdecore und kdeui sind auf jeden Fall schon automatisch mit drin. Dort befinden sich KApplication und KMainWindow. Wenn sich KLed in einer anderen Bibliothek befindet, muss die evtl. irgendwo in der Makefile.am eingetragen werden (aber nicht mit Pfad).

Das folgende HowTo hab ich mir selbst auch gerade zur Hausaufgabe erklärt:

http://developer.kde.org/documentation/other/makefile_am_howto.html

Ich vermute mal, dass da die Erklärung drin steckt.
 
OP
C

collix

Newbie
OK, dann werd ich mir mal die Makefiles ansehen.

Is ja ne tolle Seite, dieser Link, nicht schlecht...Vielen Dank

Sebastian
 

taki

Advanced Hacker
Hallo Leute.
Ich muss mich mal selbst zitieren:

taki schrieb:
automake verwendet eine Variable dafür. Die steht in der Datei Makefile.am.

...und die lautet

applikationsname_LDADD

Demnach muss hier noch die Bibliothek ergänzt werden, die die Klasse enthält, die man dazu nehmen möchte, also etwas dieser Art:

applikationsname_LDADD = $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_IRGENDWAS)
 
Oben