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.