Forum: Mikrocontroller und Digitale Elektronik Keil C51 - selbsterstellte Bibliothek und Linker-Fehler


von Ralf (Gast)


Lesenswert?

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

von Rufus T. Firefly (Gast)


Lesenswert?

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?

von Rennesson (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.