Forum: PC-Programmierung undefined reference obwohl #includes vorhanden


von AnoNim (Gast)


Lesenswert?

Hi Leutz,
ich hab nen Problem, das ich einfach nicht wegekomme.

1.Datei: SPI.cpp
Hier will ich eine Funktion SerialPutChar aufrufen, die in der 2. Datei 
vorhanden ist.
Vorhandene includes: #include Serial.h

2.Datei: Serial.cpp
Hier ist die Funktion SerialPutChar integriert.
Vorhandene includes: #include Serial.h

3. Datei Serial.h
Hier ist der Funktionsprototyp von SerielPutChar drin.
Vorhandene includes: keine

Meiner Meinung nach doch alles richtig drin. Jedoch bekomme ich beim 
Aufruf der Funktion in der 1.Datei die Fehlermeldung "undefined 
reference to SerialPutChar". Wenn ich in der 1.Datei noch "Serial.cpp" 
includiere, bekomm ich natürlich als Fehler: "multiple definitions of 
'SerialPutChar(char)' ", muss ja auch, weil ich dann ja im Kreis 
einbinde.
Hab ich grad Tomaten vor den Augen, oder gibt's da einen Trick?

von Dr. Sommer (Gast)


Lesenswert?

du musst die Serial.cpp AUCH compilieren und das Ergebnis (Serial.o oder 
so) beim Linken mit verwenden.

von AnoNim (Gast)


Lesenswert?

Achso, dummerweise vergessen zu sagen: Ich Arbeite in AVR-Studio, der 
kompiliert eigentlich schon direkt alle Dateien. (Falls das nen 
Unterschied macht: Ist C++)

von Maximilian (Gast)


Lesenswert?

Offensichtlich nicht. Also füge alle .cpp-Dateien dem Projekt hinzu, 
stelle sicher, daß keine irgendwie ausgeschlossen sind, und dann wirds 
schon gehen.

Außer natürlich, du hast vorher schon Fehler, und die Serial.cpp 
kompiliert gar nicht fehlerfrei.

von AnoNim (Gast)


Lesenswert?

Problem umgangen, taucht jetzt bei ner neuen Datei auf...
Jedoch will ich jetzt in der 1. Datei 2 Funktionen aus der 2. Datei 
aufrufen, eine geht, bei der anderen kommt wieder "undefined reference 
to xxx".

Wtf?!?

von Maximilian (Gast)


Lesenswert?

Nein, die eine "geht" nicht. Dein Linker bricht halt anscheinend nach 
dem ersten Fehler ab und zeigt den nächsten nicht mehr.

von Hmm (Gast)


Lesenswert?

Toll Meister. Du hast das Problem umgangen und schon linst es an einer 
anderen Stelle im die Ecke. Aber das macht nichts. Du hast es ja 
umgangen.
Jetzt sollen wir Dir nur noch helfen das andere Problem zu umgehen. 
Das erst entstanden ist als Du das erste umgangen hast.

Was ist eigentlich los mit Dir? Lies die Antworten und mach was daraus 
und nicht aus irgendwelchen abstrusen Deiner Phantasieen wie denn so ein 
Mikrocontroller und ein Compiler und Linker tatsächlich funktionieren.

Ja, ja ich weiss. Jetzt kommt gleich die Arie: Ich bin nur ein dummer 
Anfänger und man wird doch noch mal fragen dürfen.

Sicher! Darfst Du. Aber darfst auch selber denken.

von AnoNim (Gast)


Lesenswert?

1. Nein, mein Umgehen hat absolut nichts mit dem neuen Problem zu tun 
bzw. hat dieses nicht erzeugt.
2. Habe ich die Antworten gelesen und alle möglichen Einstellungen 
durchsucht, alle Dateien und Einstellungen stehen auf kompilieren, es 
werden laut Statusmeldung auch alle Daten mit einbezogen.
3. Die 2. Funktion, bei der der Fehler ausgelöst wird, steht in der 
main-Funktion an zweiter Stelle, nach der ersten die zu funktionieren 
scheint, in der Headerdatei und in der .cpp jedoch über der anderen 
Funktion. Daraus würde ich schließen, dass eben nicht der eine Fehler 
das Debugging abbricht, denn sonst würde ja bereits die 1. Funktion 
einen Fehler ausgeben.
4. Nein, ich bin kein Anfänger. Zumindest würde ich mich selbst nicht 
als blutigen Anfänger bezeichnen. Jedoch hab ich so ein Problem bisher 
nicht gehabt. Zumindest keins, das nicht über richtige includes gelöst 
werden konnte.
5. Ich denke dass ich ein paar Probleme dafür indentifizieren konnte: Es 
sind noch einige Präprozessordirektive in der Datei vorhanden, die ich 
nicht erwartet hatte (habe die Datei nicht komplett selbst geschrieben 
(nein, ich schreibe mir keine eigene FAT-System-Bib)).
Denke damit hat sich das soweit auch schon.

Danke für die Kommentare.

von Daniel -. (root)


Lesenswert?

begebe dich auf die Konsole .. so schwer ist es nicht
einmal manuell g++ mit Parametern ausprobieren und in Makefile 
hinterlegen
die "Umgebung" verschleiert einige Details ...

von Hmm (Gast)


Lesenswert?

Zeig einfach mal den kompletten Code.
Alles andere ist Kaffeesatzleserei.

von Maximilian (Gast)


Lesenswert?

AnoNim schrieb:
> 3. Die 2. Funktion, bei der der Fehler ausgelöst wird, steht in der
> main-Funktion an zweiter Stelle, nach der ersten die zu funktionieren
> scheint, in der Headerdatei und in der .cpp jedoch über der anderen
> Funktion. Daraus würde ich schließen, dass eben nicht der eine Fehler
> das Debugging abbricht, denn sonst würde ja bereits die 1. Funktion
> einen Fehler ausgeben.

Das ist ein Fehlschluß.

Im übrigen scheinst du nicht nur den Unterschied zwischen Kompilieren 
und Linken nicht zu kennen (und der ist hier fundamental), sondern 
wirfst nun auch noch Debugging mit in denselben Topf.

> 4. Nein, ich bin kein Anfänger. Zumindest würde ich mich selbst nicht
> als blutigen Anfänger bezeichnen. Jedoch hab ich so ein Problem bisher
> nicht gehabt. Zumindest keins, das nicht über richtige includes gelöst
> werden konnte.

Includes lösen nur keine Fehler mit undefined references.

> 5. Ich denke dass ich ein paar Probleme dafür indentifizieren konnte: Es
> sind noch einige Präprozessordirektive in der Datei vorhanden, die ich
> nicht erwartet hatte (habe die Datei nicht komplett selbst geschrieben
> (nein, ich schreibe mir keine eigene FAT-System-Bib)).

Albern hoch drei.

> Denke damit hat sich das soweit auch schon.

Ich bin jedenfalls raus. Du bist nicht nur lernresistent, sondern auch 
noch stolz drauf. Viel Spaß mit deinem Programm.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

AnoNim schrieb:
> 1.Datei: SPI.cpp
> Hier will ich eine Funktion SerialPutChar aufrufen, die in der 2. Datei
> vorhanden ist.
> Vorhandene includes: #include Serial.h
>
> 2.Datei: Serial.cpp
> Hier ist die Funktion SerialPutChar integriert.
> Vorhandene includes: #include Serial.h
>
> 3. Datei Serial.h
> Hier ist der Funktionsprototyp von SerielPutChar drin.
> Vorhandene includes: keine

Es genügt nicht, einen nur ähnlich geschriebenen Funktionsprototyp zu 
definieren, sondern es sollte sich schon um exakt die gleiche 
Schreibweise handeln.

Erstellt Du dieses Programm nun in C oder C++? Ist Dir klar, welche 
Unterschiede es zwischen den Sprachen gibt und welchen Einfluss die 
gewählte Sprache nicht nur auf das Kompilieren, sondern vor allem auch 
auf das Linken hat?

Falls Du behaupten solltest, Dir wäre der Unterschied klar, bitte ich 
Dich, die Unterschiede beim Linken kurz aufzuführen.

Oder handelt es sich gar um ein Projekt, bei dem C- und C++-Quellen 
gemischt werden?

Stimmen denn die Compiler-Einstellungen mit der jeweils gewünschten 
Sprache überein?

von Vlad T. (vlad_tepesch)


Lesenswert?

Andreas Schweigstill schrieb:
> Oder handelt es sich gar um ein Projekt, bei dem C- und C++-Quellen
> gemischt werden?

stichwort:
1
#ifdef __cplusplus
2
extern "C"{
3
#endif
4
5
6
7
#ifdef __cplusplus
8
}
9
#endif

Ein anderer Fehler, der beschriebene Symptome auslösen kann, sind 
kopierte (und damit eventuell bereits definierte) include guards.

von AnoNim (Gast)


Lesenswert?

Ja, es ist in C++ geschrieben und integriert externe c Dateien. Leider 
bin ich mit der Sache der Linker usw. nicht vertraut genug um 
qualifizierte Aussagen zu machen, geschweige denn das Problem zu 
beseitigen...

von Vlad T. (vlad_tepesch)


Lesenswert?

AnoNim schrieb:
> Leider
> bin ich mit der Sache der Linker usw. nicht vertraut genug um
> qualifizierte Aussagen zu machen, geschweige denn das Problem zu
> beseitigen...

wie wärs, wenn man dann dieses Wissen mal nachholt undnicht darauf 
wartet, dass einen andere alles vorkauen?
http://c-links.blogspot.de/2008/09/difference-between-preprocessor.html
(wobei hier die bilder besser sind als der Text, der ein paar Fehler 
enthält)

oder
http://www.cs.washington.edu/education/courses/cse378/97au/help/compilation.html

Ansonsten gilt weiterhin:
Hmm schrieb:
> Zeig einfach mal den kompletten Code.
> Alles andere ist Kaffeesatzleserei.

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.