Hallo, hab hier ein recht kompliziert zu beschreibendes Problem mit dem C51-Linker: Ich hab mir eine Bibliothek für die serielle Schnittstelle geschrieben, die ich nun austesten möchte. Die globalen Variablen, die für die Bibliothek nötig sind, sind nicht in der Bibliothek enthalten, sondern in einem eigenen C-File definiert. Die entsprechenden Deklarationen stehen im H-File zur Bibliothek, mit einem EXTERN Verweis. Das mach ich, weil ich sonst jedesmal die Lib neu compilieren müsste, wenn ich z.B. den Port-Pin für RTS/CTS geändert habe oder ich die Buffergröße ändere. Aus dem gleichen Grund sind die globalen Variablen NICHT Bestandteil der Lib. Die Lib selbst lässt sich ohne Fehler compilieren! So, nun zu meinem Problem: Ich habe nun ein neues Projekt angelegt, in dem ich die Lib verwende. Ich wollte nun in diesem neuen Projekt einfach die in der Lib enthaltenen Funktionen austesten. Aber das funktioniert nicht, ich bekomme immer Linker-Fehler (Fehlerbeschreibung weiter unten). Im H-File zur Lib habe ich die Definition, welche Port-Pins ich für die Verwendung der Handshake-Leitungen verwenden möchte: #define PORT_CTS P3^2 #define PORT_RTS P3^4 Diese Defines werden in einer externen C-Datei (also nicht Bestandteil der Lib!) mit den Variablen-Deklarationen verwendet: sbit btCTS = PORT_CTS; sbit btRTS = PORT_RTS; In der H-Datei wiederum mache ich die Variablen bekannt: extern bit btCTS; extern bit btRTS; Die Interrupt-Funktion ist NICHT Bestandteil der Lib, weil einige der Derivate für die SPI-Schnittstelle die gleiche Einsprung-Adresse haben wie die normale serielle Schnittstelle. Wenn ich jetzt compiliere, kommt für das Interrupt-Modul für die Bits btCTS und btRTS jeweils die Linker-Fehlermeldung *** ERROR L127: UNRESOLVED EXTERNAL SYMBOL und *** ERROR L128: REFERENCE MADE TO UNRESOLVED EXTERNAL. Ich habe auch im Interrupt die H-Datei eingebunden. Genauso gehören das Variablen- und das Interrupt-Modul zum Projekt. Puh, ich hoffe, ich konnte das Problem einigermassen verständlich rüberbringen... Wo liegt mein Fehler? Danke Gruß Ralf
Bindest Du die Headerdatei, in der das hier steht extern bit btCTS; extern bit btRTS; auch in das C-Sourcefile ein, in dem Du das hier sbit btCTS = PORT_CTS; sbit btRTS = PORT_RTS; stehen hast? Wenn ja, dann versuche mal durch #bedingte Kompilation das Schlüsselwort extern aus der Headerdatei verschwinden zu lassen, wenn sie aus dem C-Sourcefile #included wird. Die beiden Definitionen geschehen auch im "global scope", also außerhalb einer Funktionsdefinition?
wenn es dir hilft kannst du mal bei www.keil.com unter search die errors eingeben. da ist dann genau erklärt was die fehler bedeuten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.