Forum: Compiler & IDEs Fehler beim Compilieren der FAT Lib


von Robert (Gast)


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 :(
1
Linking: main.elf
2
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
3
dos.o: In function `Filelength':
4
dos.c:31: multiple definition of `pSPI_CS'
5
dir.o:dir.c:343: first defined here
6
drivefree.o: In function `drivefree':
7
drivefree.c:46: multiple definition of `pSPI_CS'
8
dir.o:dir.c:343: first defined here
9
fat.o: In function `GetNextClusterNumber':
10
fat.c:124: multiple definition of `pSPI_CS'
11
dir.o:dir.c:343: first defined here
12
find_x.o:(.data+0x0): multiple definition of `pSPI_CS'
13
dir.o:dir.c:343: first defined here
14
mmc_spi.o: In function `MMCCommand':
15
mmc_spi.c:57: multiple definition of `pSPI_CS'
16
dir.o:dir.c:343: first defined here
17
readraw.o:(.data+0x0): multiple definition of `pSPI_CS'
18
dir.o:dir.c:343: first defined here
19
make.exe: *** [main.elf] Error 1

Weiß jemand was da los ist??

Danke im Voraus

Gruß Robert






von Karl H. (kbuchegg)


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.

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.