C-Header: noch ein Versuch
-
Stimmt, das mit dem include-guard hatte ich bei diesem Versuch vergessen, aber auch wenn ich ihn einfüge kommen die gleichen Fehlermeldungen. Das
UNRESOLVED EXTERNAL SYMBOL
REFERENCE MADE TO UNRESOLVED SYMBOL
kommt in Bezug auf die von mir definierten Funktionen und die Meldungen "MULTIPLE PUBLIC DEFINITIONS" kommen in Bezug auf die in <EZRegs.h> definierten Variablen. Ich denke, das Problem liegt darin, dass die VAriablen in der Headerdatei <EZRegs.h> schon definiert werden (hab ich aber nicht selbst gemacht). Was sagt ihr dazu?
-
welcher Compiler? wie kompilierst du?
WAS meldet denn der Compiler als mehrfach definiert?
-
Also ich kompiliere mit der Keil-IDE. Was meinst du mit "wie kompilierst du?"? (es gibt einen Button und der heißt "build target")
Ich bekomme als Meldung (nicht vom Compiler, sondern vom Linker)
UNRESOLVED EXTERNAL SYMBOL xxx
REFERENCE MADE TO UNRESOLVED SYMBOL xxx
Das "xxx" steht hier für 40 Warnungen, die alle in dem Header <REAGAN21.H> deklarierten Variablen betreffen.
-
Strohi schrieb:
Ich bekomme als Meldung (nicht vom Compiler, sondern vom Linker)
UNRESOLVED EXTERNAL SYMBOL xxx
REFERENCE MADE TO UNRESOLVED SYMBOL xxx
Das "xxx" steht hier für 40 Warnungen, die alle in dem Header <REAGAN21.H> deklarierten Variablen betreffen.Das sieht so aus, als wenn dem Linker eine REAGAN21.obj - Datei fehlt!
-
Hast du vielleicht vergessen, die Datei REAGAN21.c zu deinem Projekt hinzuzufügen? Der Header bringt nur die Deklarationen (so dass der Compiler nicht meckert), der eigentliche Code (Definition) steht in der .c-Datei, die zu einer obj-Datei kompiliert und zu deiner exe hinzugelinkt werden muss.
-
Hallo,
Belli schrieb:
Strohi schrieb:
Ich bekomme als Meldung (nicht vom Compiler, sondern vom Linker)
UNRESOLVED EXTERNAL SYMBOL xxx
REFERENCE MADE TO UNRESOLVED SYMBOL xxx
Das "xxx" steht hier für 40 Warnungen, die alle in dem Header <REAGAN21.H> deklarierten Variablen betreffen.Das sieht so aus, als wenn dem Linker eine REAGAN21.obj - Datei fehlt!
_matze schrieb:
Hast du vielleicht vergessen, die Datei REAGAN21.c zu deinem Projekt hinzuzufügen? Der Header bringt nur die Deklarationen (so dass der Compiler nicht meckert), der eigentliche Code (Definition) steht in der .c-Datei, die zu einer obj-Datei kompiliert und zu deiner exe hinzugelinkt werden muss.
Naja, fast, wenn man sich die Header-Dateien ansieht, die er netterweise hier:
http://www.delphipraxis.net/topic142627_cheaderdateien+einbinden.html
gezeigt hat, dann muss man eigentlich nur die Kommentare in den Headern beachten (vielleicht gibt es sogar eine ezusb.lib), und dann kann es sogar funktionieren
MfG,
Probe-Nutzer
-
Also: erst mal Danke für die Antworten von euch!
Letztendlich hab ich es jetzt so gelöst, dass ich erst mal alle *.c und *.h Dateien zum Projekt hinzugefügt habe und das ganze Zeug mit dem "#include", etc. so belassen habe, wie ich es anfangs hatte. Dabei verstehe ich zwar nicht, was ich vorher falsch gemacht habe, aber trotzdem bin ich jetzt einfach froh, dass es jetzt endlich klappt!Gruß,
Stefan
-
Doch, jetzt sehe ich gerade, was ich gemacht habe: Ich habe eigentlich den ganzen Header <EZRegs.h> umgeschrieben: Hab alle Variablen mit einem extern versehen, die Adressen entfernt und in die EZRegs.c-Datei ausgelagert.
Weiß jemand, warum das den Unterschied gemacht hat? In der Headerdatei stand nämlich schon immer#ifndef EZREGS_H /* Header Sentry */ #define EZREGS_H
Ich meine, ob die Variablen jetzt im Header oder in der c-Datei deklariert werden, dürfte doch eigentlich egal sein, oder?
Gruß,
Stefan
-
Ähm, du hast einen FREMDEN Header umgeschrieben?! Das darf man, nie, niemals machen...
-
Naja, was soll ich denn machen? Ich muss den Header in 2 verschiedenen c-files nutzen. Und in diesem Header sind die Variablen blöderweise nicht nur deklariert, sondern sogar definiert worden (mit genauer Speicheradressen-Zuweisung). Dann kam halt immer der Fehler "Multiple Public definitions"... Ich hab dann einfach vor alle Variablen ein "extern" vorangestellt und die Speicheradressen-Zuweisung entfernt und dann die genaue Definition in ein c-file geschrieben und das die Header-Datei includen lassen. Was hättest du denn gemacht?
-
Jaaa?
-
Strohi schrieb:
ob die Variablen jetzt im Header oder in der c-Datei deklariert werden, dürfte doch eigentlich egal sein, oder?
nein. wenn du eine variable ohne 'extern' deklarierst, dann wird gleichzeitig auch speicher für die variable angelegt und es gibt einen eintrag in die objektdatei. mit 'extern' wird dem compiler nur der typ einer bereits angelegten variable mitgeteilt.
wenn du also im header kein 'extern' verwendest, dann wird in jeder objektdatei eine separate variable angelegt. die haben dann zwar den selben namen, sind aber verschiedene variablen mit eigenen speicherbereichen!
-
Konfusius schrieb:
wenn du also im header kein 'extern' verwendest, dann wird in jeder objektdatei eine separate variable angelegt. die haben dann zwar den selben namen, sind aber verschiedene variablen mit eigenen speicherbereichen!
Nein. Sofern die Variablen nicht als
static
deklariert wurden, dürfte es zu Linker-Mehrfachdefinitionen kommen. Erst mitstatic
wird in jeder Übersetzungseinheit eigener Speicherplatz bereitgestellt (interne Linkage).
-
Nexus schrieb:
Erst mit
static
wird in jeder Übersetzungseinheit eigener Speicherplatz bereitgestellt (interne Linkage).'static' bewirkt lediglich, daß in der objektdatei für den speicherplatz der variablen kein symbol angelegt wird. dadurch wird die variable für den linker unsichtbar.
-
_matze schrieb:
Ähm, du hast einen FREMDEN Header umgeschrieben?! Das darf man, nie, niemals machen...
Jaa?
Hier nochmal meine Frage an dich:
Ich muss den Header in 2 verschiedenen c-files nutzen. Und in diesem Header sind die Variablen blöderweise nicht nur deklariert, sondern sogar definiert worden (mit genauer Speicheradressen-Zuweisung). Dann kam halt immer der Fehler "Multiple Public definitions"... Ich hab dann einfach vor alle Variablen ein "extern" vorangestellt und die Speicheradressen-Zuweisung entfernt und dann die genaue Definition in ein c-file geschrieben und das die Header-Datei includen lassen. Was hättest du denn gemacht?Gruß,
Stefan