Nicht angemeldet. · Kennwort vergessen · Registrieren

Christian123
Mitglied seit 06/2011
4 Beiträge
Betreff: Aufgabe4: Error: Multiple Definition
Hallo,

led.c:
  1. #include <led.h>
  2.  
  3. #define PORTD (*(volatile uint8_t*) (0x12))
  4. #define DDRD (*(volatile uint8_t*) (0x08))
  5.  
  6. int8_t sb_led_on    (LED led) {
  7.     DDRD |= (1<<5);
  8.     PORTD |= (1<<7);
  9.     return 0;
  10. }


test.c
  1. #include "led.c"
  2.  
  3. void main (void) {
  4.     while(1) {
  5.  
  6.     }
  7. }

Fehlerausgabe:
Error    1    multiple definition of `sb_led_on'

Uns ist klar, dass die Methode an sich keinen Sinn ergibt. Uns geht es nur um die Behebung der Fehlermeldung.
Dieser Beitrag wurde am 20.06.2011, 22:16 von Christian123 verändert.
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Das Problem ist wahrscheinlich, dass deine test.c eine weitere led-Funktion verwendet. Deshalb wird dann das led-Modul der Libspicboard auch mit eingebunden. Das wiederum hat zur Folge, dass das es die sb_led_on doppelt gibt. Am einfachsten ist, für die anderen Funktionen einfach Leer-Funktionen zu machen, die dann gegebenenfalls 0 zurück liefern.

Statt #define .... kannst du auch einfach die avr/io.h einbinden.
Christian123
Mitglied seit 06/2011
4 Beiträge
Mh... wir rufen in der test.c keine weitere led-Funktionen auf. Das ist unser gesamter Quellcode den wir oben gepostet haben...
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Arg, ich sollte genau lesen. Problem ist das gleiche. Du hast die die sb_led_on in deiner test.c und in der led.c.  (Das Warum kannst du dir Überlegen ;) )

Tip: Verwende doch die Code-Funktion des Forums. Am Besten mit [code=c]<...dein code>[/code].
Christian123
Mitglied seit 06/2011
4 Beiträge
wegen dem
  1. #include "led.c"


ich steh gerade auf dem Schlauch... wie soll ich denn sonst die beiden Datein test.c und led.c miteinander verknüpfen, damit die Main in test.c die Methoden von led.c kennt?
Steppenwolf
GSPiC-Übungsleiter
Mitglied seit 05/2011
31 Beiträge
Hi Christian,

du liegst richtig, es liegt an dem Inkludieren der C-Datei. Korrekterweise muesstest du nur die Header-Datei einbinden -- genau mit dem Zweck, dass main() in test.c die Methoden von led.c kennt, wie du selbst schreibst. Das ist genau der Unterschied zwischen einer Funktions*deklaration* (zum "Kennenlernen" von Funktionen) und einer Funktions*definition* (welche die Implementierung bereitstellt, also den eigentlichen Code).

Das #include bindet einfach nur textuell die komplette Datei ein, die man ihm als Parameter uebergibt, in deinem Fall also led.c. Damit ist in test.c eine Funktion sb_led_on() *definiert*, und ausserdem wird ueber die Projekteinstellungen die led.c selbst nochmal kompiliert und dazugelinkt -- und dann beschwert sich eben der Linker ueber die doppelte Definition.

Als Faustregel gilt: Nach #include stehen normalerweise nur Header-Dateien. *Deklarationen* kann der Compiler uebrigens beliebig viele sehen, vorausgesetzt, sie sind gleich.
Christian123
Mitglied seit 06/2011
4 Beiträge
Danke für die Hilfe ;-)
Jetzt funktioniert es
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen