Forum: Mikrocontroller und Digitale Elektronik "Multiple Definition of." Warum?


von Marcus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Könnt ihr euch bitte den angehängten Code durchlesen? Wenn ich das 
gesamte Projekt compilieren möchte, dann schreit der Compiler in der 
angehängten 'GlobalVar.h'. Folgende Kommentare gibt er mehrmals aus:
1
Multiple Definition of 'ArrowPosition'
2
Multiple Definition of 'CurrentFrame'
3
Multiple Definition of 'Private_ArrowPosition'
4
Multiple Definition of 'Private_CurrentFrame'

Könnt ihr was damit anfangen, oder benötigt ihr die anderen Dateien 
auch?

Mfg Marcus

von AVerr (Gast)


Lesenswert?

Zu deinem eigentlichen Problem kann ich nicht beitragen, aber deine 
Überprüfung, ob GetSet nun auf Get oder Set steht, wird so nicht 
funktionieren.
1
if (GetSet = Set)
GetSet wird so der Wert Set zugewiesen. Was du aber brauchst, ist der 
Vergleichsoperator ==.

Gruß,
AVerr

von Stefan E. (sternst)


Lesenswert?

In dieser Header-Datei befinden sich Definitionen. Wenn sie in deinem 
Projekt mehrfach inkludiert wird, hast du mehrfache Definitionen für die 
gleichen Objekte. Und genau das sagen dir die Fehlermeldungen.

von Marcus (Gast)


Lesenswert?

@AVerr: Danke!

@Stefan Ernst: Meinst du damit, dass ich die Funktionen in eine C-Datei 
geben soll und nur die Definitionen in der Header-Datei lassen soll?

von Daniel -. (root)


Lesenswert?

oh im Header sollten in C nie definitionen stehen!
merke:
kein Code (im Sinne von Algorithmen in Funktionen)
keine Variablen Defintionen (nicht int x; sondern extern int x;)


C++ ist eine andere Baustelle ...

von Daniel -. (root)


Lesenswert?

mache dir nochmal klar den Unterschied zwischen Deklarationen
und Definitionen im Sprachgebrauch von C
google wird sicher viel finden

von Marcus (Gast)


Angehängte Dateien:

Lesenswert?

Danke!

Das Problem mit "Multiple Definition of ..." habe ich jetzt nicht mehr. 
Allerdings sagt er mir jetzt "Undefined reference to '...'" überall, wo 
ich eine der beiden Funktionen aufrufe. Ich verstehe nicht, warum er es 
nicht nimmt weil es bei den anderen Funktionen ja auch funktioniert. 
Oder liege ich da falsch?

In der Interrupts.c setzte ich diese Funktionen ein.

von Marcus (Gast)


Lesenswert?

Ach mensch ich habe vergessen die GlobalVar.c in die Projektmappe zu 
ziehen :-)

von Daniel -. (root)


Lesenswert?

was ist mit "FrameHome()", die ist nicht in globalvar.h

Die Reihenfolge beim Build ist wichtig.
Deswegen schreibt man üblicherweise makefiles.

Benutzt du eine IDE oder Kommandozeile?
Wenn das letzte, wie sehen bei dir die Compiler Aufrufe?

von Daniel -. (root)


Lesenswert?

freut mich das das Problem nicht mehr besteht ;)

von Thomas (Gast)


Lesenswert?

Stefan Ernst schrieb:
> In dieser Header-Datei befinden sich Definitionen. Wenn sie in deinem
> Projekt mehrfach inkludiert wird, hast du mehrfache Definitionen für die
> gleichen Objekte. Und genau das sagen dir die Fehlermeldungen.

Und wieso soll das nicht durch
1
#ifndef GlobalVar
2
#define GlobalVar
3
...
4
#endif

verhindert werden?

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:
> Stefan Ernst schrieb:
>> In dieser Header-Datei befinden sich Definitionen. Wenn sie in deinem
>> Projekt mehrfach inkludiert wird, hast du mehrfache Definitionen für die
>> gleichen Objekte. Und genau das sagen dir die Fehlermeldungen.
>
> Und wieso soll das nicht durch
>
1
> #ifndef GlobalVar
2
> #define GlobalVar
3
> ...
4
> #endif
5
>
>
> verhindert werden?

Weil meherer C-Files voneinander unabhängig compiliert werden. 
Include-Guards (so nennt man diese Konstrukte) befassen sich mit anderen 
Problemen. Bei include-Guards geht es um Mehrfachdefinitionen in einer 
Übersetzungseinheit. Das hier beschriebene Problem ist aber ein 
Linkerproblem.

von Marcus (Gast)


Lesenswert?

@Daniel: Hat sich zwar schon erledigt, aber trotzdem: Ich verwende 
AVR-Studio 5. "FrameHome()" ist die vorübergehende Lösung für den 
"Homebildschirm" auf dem DOGM128. Die Get-Set Methode verwende ich 
eigentlich nur weil ich etwas neues probieren wollte. Später sollen 
einige Werte in ein externes Flash gespeichert werden. Ich möchte 
nämlich ein kleines OS für meinen AT644 schreiben.

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.