mikrocontroller.net

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


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rennesson (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.