Forum: Compiler & IDEs undefined reference to?


von qwertz (Gast)


Lesenswert?

Hallo,

ich habe im AVR Studio 5 ein bestehendes µC Projekt geöffnet und möchte 
dieses erweitern.

Dazu habe ich eine neue .cpp Datei mit neuen Funktionen angelegt, welche 
ich in der main aufrufe.
Die Prototypen aller Funktionen habe ich in einem neuen header 
deklariert, welchen ich in der Main angebe.

Nun kommt immer diese Fehlermeldung: undefined reference to

Woran kann es liegen?

von Hmm (Gast)


Lesenswert?

>Woran kann es liegen?

Was an: "undefined reference to" verstehst Du nicht?

von Kindergärtner (Gast)


Lesenswert?


von qwertz (Gast)


Lesenswert?

google hat mir eigentlich nicht sehr geholfen

Diese Fehlermeldung kommt doch eigentlich, wenn ich keinen prototypen 
der funktion habe, aber der ist vorhanden und die header ist 
eingebunden.

Ich versteh nicht was ich falsch gemacht haben soll.

von Rene H. (Gast)


Lesenswert?

Nein, diese Fehlermeldung kommt, wenn Du das nötige File nicht dazu 
linkst.

Grüße,
René

von Hmm (Gast)


Lesenswert?

>Diese Fehlermeldung kommt doch eigentlich, wenn ich keinen prototypen
>der funktion habe, aber der ist vorhanden und die header ist
>eingebunden.

Die Fehlermeldung kommt in auch, wenn es keine "Definition" der Funktion 
gibt. Der Linker findet also keine Code-Adresse die er verwenden kann. 
Das ist der primäre Grund. Ob das nun an einer fehlenden Objekt-Datei 
oder der fehlenden Angabe im Linker-Aufruf liegt wissen wir nicht.

von Hmm (Gast)


Lesenswert?

Ein fehlender Prototyp spielt dabei eine untergeordnete Rolle.
Da hätte nämlich schon der Compiler gewarnt.

von qwertz (Gast)


Lesenswert?

Rene H. schrieb:
> Nein, diese Fehlermeldung kommt, wenn Du das nötige File nicht dazu
> linkst.

Wie linke ich diesen richtig?

von Karl H. (kbuchegg)


Lesenswert?

qwertz schrieb:
> google hat mir eigentlich nicht sehr geholfen
>
> Diese Fehlermeldung kommt doch eigentlich, wenn ich keinen prototypen
> der funktion habe, aber der ist vorhanden und die header ist
> eingebunden.

Das reicht aber nicht.

Das befriedigt nur den Compiler, wenn er das C-File compiliert, welches 
die Funktionen verwenden will.

Aber
* das C-File mit den eigentlichen Funktionen muss ja ebenfalls 
compiliert werden
* der Linker muss wissen, dass er dieses bereits compilierte File mit 
den Funktionen dann auch zum kompletten Programm mit dazunehmen muss.

> Ich versteh nicht was ich falsch gemacht haben soll.

Du hast das C-File nicht mit zu den zu diesem Projekt gehörenden Source 
Code Files in der Projektverwaltung mit aufgenommen.
Daher sorgt die Projektverwaltung nicht dafür, dass dieses C-File auch 
compiliert wird. Daher wird dann das Ergebnis davon nicht mit ins 
fertige Programm aufgenommen.
Folge: Der Linker versucht das Programm vollständig zu machen, kann es 
aber nicht, weil der die Implementierungen der Funktionen nicht findet. 
Als Folge davon teilt er dir dies mit - in Form einer Fehlermeldung 
'undefined reference'. Im restlichen Programm ist eine Referenz auf 
Funktionen enthalten 'Ich würde gerne xyz aufrufen', aber die Funktionen 
selbst existieren nicht (sind 'undefined').
D.h. sie sind ja nicht wirklich 'nicht existent'. Nur weiß kein Schwein 
ausser dir, dass dieses C-File ebenfalls mit zum Projekt gehört. Du 
kannst auf deinem Verzeichnis 300 Millionen C-Files rumliegen haben; 
deswegen werden die noch lange nicht automatisch compiliert und mit 
dazugelinkt. Du musst schon deiner Projektverwaltung mitteilen: "Das 
gehört mit dazu und das ebenfalls" - die restlichen 299999998 C-Files 
werden dann einfach ignoriert, weil sie ja nicht zum Projekt gehören.

Nimm das C-File mit in die Projektverwaltung auf und alles ist gut - 
solange du keine Syntaxfehler in den Funktionen hast und alles sauber 
compiliert, natürlich.

von Hmm (Gast)


Lesenswert?

Und diese Informationen findest Du mit dem Stichwort "undefined 
reference" nicht bei Google? Hmm. Welches Google verwendest Du?

von qwertz (Gast)


Lesenswert?

@Karl Heinz Buchegger: erstmal 1000 Dank für die Hilfe !!

> Nimm das C-File mit in die Projektverwaltung auf und alles ist gut

Wie mache ich das im AVR Studio 5 ?

von Rene H. (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

qwertz schrieb:
> @Karl Heinz Buchegger: erstmal 1000 Dank für die Hilfe !!
>
>> Nimm das C-File mit in die Projektverwaltung auf und alles ist gut
>
> Wie mache ich das im AVR Studio 5 ?

Indem du zb in dem Teil vom Studio, in dem alle zum Projekt gehörenden 
Dateien aufgelistet sind, einfach mal auf die rechte Maustaste drückst 
und dir ansiehst, welche Menüpunkte dir das Studio so anbietet.

von m.freiberg84 (Gast)


Angehängte Dateien:

Lesenswert?

Hallöchen,

ja der Beitrag ist alt aber habe das selbe Problem.

Wie auf dem Bild zu erkennen werden die Definitionen nicht erkannt 
obwohl ich die .c-Dateien im Solution Explorer habe und diese in der 
Regel auch mit compiliert werden.

Genauer gesagt versuche ich mein komplettes Projekt zu umzugestalten das 
es der C-Konform entspricht und ansehnlicher wird. Vorher hatte ich 
alles (auch Funktionsdefinitionen) in .h-Dateien gepackt. Das lief auch 
alles super nur seitdem ich es alles versuche richtig zu machen klappt 
nichts mehr. und momentan komme ich nicht darauf warum der die 
definitionen nicht findet obwohl sie alle da sind???

habt ihr eine Idee woran es liegt das der Compiler, obwohl alles 
vorhanden ist, nichts findet?

Danke im voraus!

P.S. Bitte nicht fertig machen weil alles etwas wirr aussieht, bin ja 
wie gesagt gerade dabei alles schön zu machen um es dann in zukunft 
alles gleich so zu schreiben :D

von Hans (Gast)


Lesenswert?

Du hast anscheinend ein C++-Projekt statt einem C-Projekt erstellt. 
Also:
- Projektdatei löschen
- Schaltfaktor.cpp in schaltfaktor.c umbenennen
- Neues C-Projekt erstellen
- Alle c- und h-Dateien einfügen (Add Existing File to Projekt)

von m.freiberg84 (Gast)


Lesenswert?

OK Habs ausprobiert....

kompiliert....

keine fehler.....

ich verneige mich vor Dir....

3 std. gesucht und nichts gefunden, aus Angst wieder als Troll 
bezeichnet zu werden gekniffen zu fragen.

Und nun? DANKE!!!!! DANKE!!!! DANKE!!!!!!

von Sven S. (boldie)


Lesenswert?

Das geht auch in einem C++ Projekt, dazu musst du aber die in C 
Compilierten Teile anders deklarierern (im headerfile des C-Codes 
folgendes einfügen ...).
1
#ifdef __cplusplus
2
extern "C" {
3
#endif
4
5
/*Hier kommen die Funktionsdeklarationen*/
6
7
#ifdef __cplusplus
8
}
9
#endif

Vielleicht kann es jmd. einmal brauchen. Hintergrund ist das andere name 
mangling von C++ im Vergleich zu C.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.