Keil C51 - selbsterstellte Bibliothek und Linker-Fehler

Gast #173378
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
Gast
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.