Forum: Compiler & IDEs include Dateien


von josch (Gast)


Lesenswert?

Hallo

Hier mal wieder ne Anfängerfrage.
Ich schreibe gerade ein Programm unter WIN-AVR, für dieses benötige ich
die Datei lcd.h (Ich will mit nem Display rumspielen).
Jetzt hab ich festgestellt, dass ich die Dateien lcd.h und lcd.c in
meinem Verzeichnis haben muss, in dem auch mein derzeitiger Quellcode
liegt ansonsten kommt ein Fehler (No rule to make target `lcd.c').

Jetzt ist meine Frage, ob ich diese lcd-Bibliothek nicht irgendwie in
den Compiler einbinden kann, so dass ich nicht jedesmal diese Dateien
in meine Entwicklungsverzeichnisse kopieren muss wenn ich ein neues
Programm schreibe. Im avr/include-Verzeichnis hab ich sie schon - das
hat nicht geholfen. Oder liegts am Makefile?
Das geht doch sicher irgendwie - nur hab ich's vermutlich mal wieder
überlesen.

viele Grüße
Josch

von Jörg Wunsch (Gast)


Lesenswert?

Nun, Du solltest Dir erstmal über die Begrifflichkeiten im Klaren
werden.

Eine Headerdatei deklariert ein Interface zu irgendwas.  Diese muß vom
Compiler beim Compilieren all derjenigen C-Quelldateien auffindbar
sein, die darin deklarierte Funktionalität benutzen wollen.

Deine Methode, sie ins Systemverzeichnis (für Headerdateien) zu
werfen, ist eher brutal.  Die normale Methode wäre es, dem Compiler
mit -I zu erzählen, wo er überall seine Headerdateien suchen soll.  Im
Makefile-Template ist der Makro CINCS dafür reserviert, daß man in ihm
alle -I Anweisungen für den Compiler aufführt.  (Wenn Du Dir einen
Gefallen tun willst, trennst Du die Pfadnamen nicht mit \ sondern mit
/, andernfalls müßtest Du alle \ als \\ notieren, weil die
Interpretation der make-erzeugten Kommandos von einer Unix-Shell
vorgenommen wird.  Windows versteht aber auch die Vorwärtsstriche
intern anstandslos.)

Eine Bibliothek im landläufigen Sinne ist eine Objektmodulbibliothek,
Endung .a (Mnemonik: archive).  Diese enthält vorcompilierte
Objektmoduln, die vom Linker bei Bedarf hinzugefügt werden können.
Man gibt dem Linker nur den Namen der Bibliothek mit an, und anhand
der Endung .a weiß er, daß er aus dem Archiv nur das nehmen soll, was
gebraucht wird.

Auf diese Weise ist die Standardbibliothek (libc.a) aufgebaut.
Angelegt werden sie mit dem Kommando avr-ar.

Der Nachteil ist, daß Du eine solche Bibliothek praktisch für jeden
AVR-Typ separat compilieren mußt, da in aller Regel die C-Programme
viele Hardwareabhängigkeiten aufweisen.

Alternativ kannst Du gleich Deine C-Quelldatei (ggf. mit vollem
Pfadnamen) dem Compiler mit angeben.  Dann wird sie für Dein konkretes
Projekt (und mit dessen -mmcu= Option) in eine Objektdatei compiliert
und mit hinzugelinkt.  Das dauert zwar theoretisch etwas länger als
das Extrahieren aus einer Bibliothek, aber der Unterschied ist bei
heutigen Compiler-/Computergeschwindigkeiten zu vernachlässigen.

von josch (Gast)


Lesenswert?

uff, an der Antwort hab ich jetzt erstmal ein wenig zu arbeiten.
Mein Programm läuft zwar so zur Hälfte ganz gut - aber ich merke
gerade, dass ich gar nicht wirklich weiss warum bzw. wie es dazu
gekommen ist - und vor allem, ob das wenigstens halbwegs gut ist, was
ich da zusammengkittet hab.
Also auf zu neuen Ufern...

Danke, dass Du mir schon mal ein paar Laternen hingestellt hast

viele Grüße
Josch

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.