www.mikrocontroller.net

Forum: Compiler & IDEs Fehler beim Compilieren der FAT Lib


Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle!

Ich schreibe gerade die Multible Fat Lib von Holger KLabunde für das 
Arthernet Projekt um. Bei Arthernet wird der SPI Pin über den CPLD 
gesteuert. Der Zeiger pSPI_CS zeigt mir in das ensprechende Register im 
CPLD.

Jedoch bekomm ich immer eine Fehlermeldung beim Linken die ich nicht 
verstehe :(
Linking: main.elf
avr-gcc -mmcu=atmega128 -I. -gstabs -DF_CPU=16000000UL  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -If:/Programme/AVRlib -std=gnu99 -MD -MP -MF .dep/main.elf.d main.o dir.o dos.o drivefree.o dumpsect.o fat.o find_x.o mmc_spi.o printf.o readraw.o serial.o --output main.elf -Wl,-Map=main.map,--cref    -lm
dos.o: In function `Filelength':
dos.c:31: multiple definition of `pSPI_CS'
dir.o:dir.c:343: first defined here
drivefree.o: In function `drivefree':
drivefree.c:46: multiple definition of `pSPI_CS'
dir.o:dir.c:343: first defined here
fat.o: In function `GetNextClusterNumber':
fat.c:124: multiple definition of `pSPI_CS'
dir.o:dir.c:343: first defined here
find_x.o:(.data+0x0): multiple definition of `pSPI_CS'
dir.o:dir.c:343: first defined here
mmc_spi.o: In function `MMCCommand':
mmc_spi.c:57: multiple definition of `pSPI_CS'
dir.o:dir.c:343: first defined here
readraw.o:(.data+0x0): multiple definition of `pSPI_CS'
dir.o:dir.c:343: first defined here
make.exe: *** [main.elf] Error 1

Weiß jemand was da los ist??

Danke im Voraus

Gruß Robert






Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pSPI_CS dürfte eine Variable sein, die in irgendeinem
Header File definiert ist.

header.h
********

unsigned char* pSPI_CS;

Nun wird dieses header.h in andere *.c mittels #include
eingebunden. Dabei wird für jedes dieser *.c vom Compiler
eine neue Variable namens pSPI_CS erzeugt.
Beim Linken gibt es dann natürlich Probleme, da der Linker
viele globale Variablen mit dem gleichen Namen vorfindet.
(Daher auch: multiple definition).

Wie man das Problem löst, hängt jetzt davon ab, was die
ursprüngliche Absicht war. Ich gah mal vom häufigsten
Fall aus: Eine globale Variable auf die mehrere *.c
Zugriff haben sollen.

Dazu muss man die Variable im Header File als extern
deklarieren:

header.h
********

extern unsigned char* pSPI_CS;

(oder was halt immer der Datentyp für pSPI_CS ist). Wichtig
ist das 'extern'. Es teilt dem Compiler mit, dass er keine
Variable mit diesem Namen erzeugen soll, da es sie irgendwo
anders schon gibt. Wenn der Compiler also dos.c compiliert
und durch den #include auf die pSPI_CS stösst, dann weiss er:
keine Variable dafür erzeugen, gibt es schon irgendwo. Für
den Linker aber einen Hinweis hinterlassen, dass er alle
Zugriffe auf pSPI_CS auf diese Variable führen muss.
Dasselbe dann in allen anderen *.c
Bis auf eine Ausnahme: Irgendwo muss es natürlich diese
Variable tatsächlich geben. Es kann ja nicht sein, dass sich
alle *.c nur darauf verlassen, dass es die Variable irgendwo gibt.
Irgendwo muss sie tatsächlich einmal definiert werden.

Das heist in deinem Programm, muss es tatsächlich eine
Definition geben:

unsigned char* pSPI_CS;

Aber die darf es nur ein einziges mal geben. Alle anderen
Vorkommnisse sind durch das 'extern' lediglich Deklarationen .

(Definition: da wird tatsächlich vom Compiler etwas erzeugt; es
 wird Speicher reserviert. Sei es eine Variable oder sei es eine
 Funktion.
 Deklaration: dem Compiler wird lediglich mitgeteilt, dass es
 irgendwo etwas gibt und wie dieses etwas aussieht. Sei es jetzt
 eine Variable oder sei es eine Funktion [=Protoyp]
)

In C darf jeder Bestendteil eines Programmes nur einmal
definiert wird. Deklararieren kannst du aber so oft du willst,
solange nur alle Deklarationen übereinstimmen. Eine Definition
ist gleichzeitig immer auch eine Deklaration.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.