Code:
Viel Verwirrung entsteht dadurch, dass nicht bekannt ist, dass das Erzeugen und Nutzen einer Library aus verschiedenen Blickwinkeln zu betrachten ist.
Es gibt DREI Richtungen in die wir sehen müssen:
1: Die Umgebung zum übersetzen (WinAVR)
2: Die Asuro-LIB (im Forum erarbeitet, von m.a.r.v.i.n zusammengestellt/verwaltet)
3. Deine Asuro-Programme
----------------------
Richtung 1: ---> Hier ist das Kompilierungs-System untergebracht.
Dies wird von der Asuro-CD installiert.
Vor allem findest du hier den Compiler avr-gcc.exe
Dieses Verzeichnis müssen wir beide jetzt erst einmal finden. (du kennst es bestimmt schon.)
Ich habe auf meiner WinXP-Kiste ab 'Arbeitsplatz' nach avr-gcc.exe gesucht.
Ich habe als Antwort für avr-gcc.exe den Pfad:
C:\Programme\Meine\Prog\AVR-Win\bin
bekommen. Das \bin vergessen wir nun ganz schnell.
Der Rest --> C:\Programme\Meine\Prog\AVR-Win <-- ist erst einmal nur interessant.
(bei dir garantiert anders, und darf auch auf D oder E oder sonst wo sein)
----> Das Verzeichnis heißt nun GCC-HOME
----------------------
Richtung 2: ---> Hier gibt es 2 Möglichkeit zur Installation:
2a: Die Datei AsuroLib-v270rc3-Setup.exe (Kurz: Setup-Version)
2b: Die Datei AsuroLib-v270rc3.zip (Kurz: ZIP-Version)
Die Setup-Version schlägt C:\ASURO_SRC\AsuroLib als Installationsverzeichnis vor.
Bei der ZIP-Version kannst du einfach ein Verzeichnis auswählen. (Der Rest gilt für beide Versionen)
HOFFENTLICH hast du NICHT das Verzeichnis GCC-HOME zur Installation angegeben.
Dann wäre nun das Verzeichnis GCC-HOME\lib eine 'Müllkippe', da sowohl das WinAVR und auch die Asuro-LIB dann ihre Dateien da gespeichert haben.
Weitere betroffene Verzeichnisse wären:
GCC-HOME\examples
GCC-HOME\doc
Wenn du die Asuro-LIB also in GCC-HOME installiert hast, dann lass es so wie es ist.
KEINESFALLS die Lib deinstallieren, da mit Sicherheit diese Verzeichnisse komplett gelöscht werden und somit auch die Dateien aus unserem GCC-HOME weg wären.
Wenn du doch schon deinstallieren möchtest, musst du sicherheitshalber WinAVR und natürlich die Asuro-LIB neu installieren.
Wenn du die Lib nicht deinstallieren möchtest, reicht es sie noch mal neu zu installieren. (Aber bitte dann nicht GCC-HOME angeben)
Bei mir ist die Lib also unter C:\ASURO_SRC\AsuroLib und
----> dieses Verzeichnis heißt nun LIB-HOME
----------------
Richtung 3: ---> Alle deine Programme
Im Prinzip ist es egal wo diese Dateien liegen. Aber eben nur im Prinzip. (Böses Prinzip)
Da kommen wir noch drauf zurück und vergeben erst einmal
-----> den Namen PROG-HOME
Uff, jetzt haben wir erst einmal sortiert.
Nun ein bisschen davon, was wir wollen.
Eigentlich wollen wir nur die Asuro-LIB übersetzen können, um z.B. geänderte Werte aus LIB-HOME\lib\inc\myasuro.h zu 'aktivieren'.
Wo kommt dies Datei her? ---> Aus der Asuro-LIB. Also müssen wir die LIB übersetzen. <---
Was aber passiert da eigentlich?
FAST alle C-Dateien im Verzeichnis LIB-HOME\lib werden mit dem DORT vorhandenen Makefile übersetzt und zu der Datei libasuro.a zusammengebaut.
Einige diese C-Dateien holen nun über #include "myasuro.h" die Infos aus der Datei myasuro.h und holen sich auf DIESEM WEG die von dir eingetragenen Werte.
Genau an dieser Stelle werden diese Werte schon FEST in der LIB-Datei libasuro.a 'eingebaut'.
Es MUSS somit immer in diesem Verzeichnis LIB-HOME\lib und LIB-HOME\lib\inc editiert werden. NIE woanders, wenn du etwas an der Asuro-LIB ändern willst.
Du weißt nun auch, dass myasuro.h zur Asuro-LIB gehört und NICHT zu deinen Programmen.
Noch hast du aber damit kein eigenes Programm übersetzt.
Dafür gibt es nun das ZWEITE Makefile in deinen Programmverzeichnissen, die irgendwo unter PROG-HOME liegen.
Ein dort liegende Makefile sorgt nun dafür, dass vor allem deine C-Dateien übersetzt werden.
Es übersetzt aber (leider) auch noch die Datei asuro.c aus dem Verzeichnis LIB-HOME\lib und deshalb wirst du nach dem übersetzten in deinem PROG-HOME\dein-Unterverzeichnis immer Dateien finden die asuro.? heißen. (Lass sie einfach da liegen, das ist aktuell so OK)
Nach dem Übersetzen deiner Programme kommt der große Augenblick, dass die fehlerfrei übersetzten Dateien noch gelinkt werden müssen, damit alles zusammengebaut ist, um endlich dein Programm als ???.hex zu erhalten.
Genau hier beim Linken, wird nun auch die libasuro.a zu deinem Programm hinzugefügt.
Dies alles erledigt das Makefile im PROG-HOME\dein-Unterverzeichnis mit einem Aufruf von make.
Im Makefile sind Befehle vorhanden, die *.c-Dateien in *.o-Dateien übersetzen.
Und eben der Linkerbefehl, der dann alle *.o und alle benötigten *.a (Ja, auch die libasuro.a) zu einem *.hex zusammenbaut.
Jetzt also haben wir über DEN UMWEG der übersetzten Asuro-LIB auch die Information aus der myasuro.h in deinem Programm.
Ich hoffe, dass jetzt erst einmal das Prinzip klarer geworden ist.
Für Raucher nun eine Zigarettenpause. Die anderen arbeiten weiter ;-)
Wir haben die ganze Zeit nichts vom Verzeichnis GCC-HOME gehört. Das holen wir nun nach.
In deinen Programmen baust du ja immer ein #include <asuro.h> ein. (Es sollten wirklich die <> sein. So aus Prinzip, weil die Datei nun aus dem GCC-HOME geholt werden soll.)
Wo muss denn die Datei sein, damit sie auch vom Compiler gefunden wird?
Ist eigentlich einfach, da der Compiler ein 'Lieblingsverzeichnis' hat.
Dies ist das Verzeichnis: GCC-HOME\avr\include
-> Nicht verwechseln mit: GCC-HOME\include
Und auch der Linker muss wissen, wo er die LIB-Datei libasuro.a finden kann.
Dies weiß der Linker auch von ganz alleine, wenn man die libasuro.a an 'die richtige' Stelle kopiert hat. Ist eben ein weiteres 'Lieblingsverzeichnis'.
Dies ist das Verzeichnis: GCC-HOME\avr\lib
-> Nicht verwechseln mit: GCC-HOME\lib
----> Trommelwirbel <------
Jetzt ist erst einmal klar, was mit übersetzten der Lib gemeint ist, und wo denn alle Dateien hin müssen.
Nun kommen die Änderungen in den (JA Mehrzahl) Makefile’s:
--------------------
LIB-HOME\lib\Makefile
Oh Mist aber auch. Die Datei ist nicht vorhanden! Keine Panik.
Mit der Setup-Version von m.a.r.v.i.n es gibt nur die Datei Makefile.orig.
KOPIERE diese Datei einfach nach Makefile, und schon ist sie vorhanden.
m.a.r.v.i.n wusste ja, dass man in der Datei etwas 'fummeln' muss, und hat deshalb kein 'Original' mitgegeben.
Also: Erst einmal Makefile.orig KOPIEREN nach Makefile
P.S.: In der ZIP-Version ist schon eine Kopie vorhanden. (Warum? Keine Ahnung)
In diesem Makefile suchen und ändern wir nun folgendes:
-1-> Suche: DIRAVR = c:/winavr
---> Ändern: DIRAVR = GCC-HOME
Bei mir also C:/Programme/Meine/Prog/AVR-Win (Bitte den / tatsächlich benutzen.)
-2-> Suche: DIRINC = .
---> Ändern: DIRINC = $(DIRAVR)/avr/include
Achtung: Da ist tatsächlich ein Punkt hinter dem = Der muss weg.
-3-> Suche: HEADER = asuro.h
---> Ändern: HEADER = *.h
-4-> Suche: cp inc/$(HEADER) $(DIRINC)/$(HEADER)
---> Ändern: cp inc/$(HEADER) $(DIRINC)
ACHTUNG: vor dem 'cp' sind KEINE Leerzeichen. ES MUSS EIN TAB-ZEICHEN BLEIBEN! SONST GEHT NICHTS MEHR!
Erklärung zu:
-1- Aus diesem Grund hat m.a.r.v.i.n das Makefile als Makefile.orig
mitgegeben. Hier kann er ja nicht wissen, wo du dein winavr als
GCC-HOME installiert hast.
-2- Fehlerbehebung: Das Ziel für die asuro.h soll ja in dem
'Lieblingsverzeichnis' vom GCC-HOME liegen.
-3- Optimierung: Es sind mittlerweile ja schon einige Header-Dateien für
die Asuro-LIB unter LIB-HOME/inc abgelegt. Also macht es auch Sinn, dass
alle Header in das 'Lieblingsverzeichnis' kopiert werden. Dafür der *
-4- Jetzt müssen die unter -3- angegeben Dateien noch in das
Lieblingsverzeichnis kopiert werden.
Bei einer einzelnen Datei (asuro.h) ging der alte Befehl noch.
Bei mehreren Dateien (*.h) dürfen wir nur das Zielverzeichnis angeben.
-----------------
PROD-HOME\dein-Unterverzeichnis\Makefile
Hier nehmen wir erst einmal ein Makefile als Muster aus LIB-HOME\examples\EncoderTest und KOPIEREN es nun in unser Verzeichnis PROD-HOME\dein-Unterverzeichnis.
Auch in diesem Makefile müssen wir suchen und ändern.
Let's go:
-1-> Suche: TARGET = test
---> Ändern: TARGET = folgelinie
Dies ist NUR dann notwendig, wenn du deine Datei 'Haupt-C-Datei', die mit dem main() drin, geändert hast nach folgelinie.c (Ist nur der Vollständigkeit erklärt. Es kann ja mal vorkommen, dass man nicht immer test.hex-Dateien haben möchte. Ist für dich aber bestimmt nichts Neues.)
-2-> Suche: SRC += asuro.c
---> Ändern: SRC += asuro.c linienlesen.c linienauswerten.c
Auch dies ist NUR notwendig, wenn du deine Programme in verschiedenen Source-Dateien verteilt hast. (Wird später im Leben mal interessant. Aber seltenst beim Asuro.)
Hier ist auch der Grund, warum du nach dem übersetzten, in deinem Verzeichnis die oben angesprochenen Dateien asuro.? bekommst. Schließlich wird hiermit die Datei asuro.c übersetzt.
Und wie findet der Compiler die Datei asuro.c?
Mit dem gleich kommenden VPATH
-3-> Suche: CFLAGS = -g -O$(OPT) -I../../lib/inc\
---> Ändern: CFLAGS = -g -O$(OPT) \
ACHTUNG: der \ am Ende der Zeile ist auch wieder SEHR WICHTIG. Fehlt er: AUCH HIER GEHT DANN NICHTS MEHR!
-4-> Suche: VPATH=../../lib
---> Ändern: VPATH=LIB-HOME/lib
Die beiden Änderungen -3- und -4- sind der Grund, warum ich oben vom 'bösen Prinzip' sprach.
Durch diese, nun ausgetauschte, Konstruktion, hat m.a.r.v.i.n (oder es war schon immer so in den Makefile's drin.) FESTGELEGT, dass es leider nicht erlaubt ist, die eigenen Programme irgendwo auf deiner Festplatte zu speichern.
Mit -3- lösen wir jetzt das Problem der Header-Dateien (z.b. #include <asuro.h>), aber noch nicht das Problem mit der zu übersetzenden asuro.c.
Bei -3- lassen wir einfach das make-Kommando -I[Pfadangabe] weg. Von nun an sucht der Compiler nur noch in seinem Lieblingsverzeichnis für Header-Dateien. Da wir aber schon alle Header-Dateien aus LIB-HOME/lib/inc nach GCC-HOME/avr/include kopiert haben (oben mit dem Makefile aus LIB-HOME/lib), werden sie nun auch dort gefunden.
-4- löst das Problem, dass die Datei asuro.c nun auch gefunden werden kann, ohne dass du dein PROG-HOME an die 'richtige' Stelle auf deiner Festplatte legen musst.
Diese Makefile kann nun für alle deine selbst geschriebenen Projekte unter PROG-HOME benutzt werden. Du brauchst nun höchstens noch bei -1- oder -2- Anpassungen zu machen.
Und zu guter letzt: Wie ruft man am besten ein make auf?
Mit der guten alten DOS-Shell (so mache ich es)
START / Programme / Zubehör / Eingabeaufforderung (Sollte da wohl sein)
Aufs Laufwerk wechseln zum Laufwerksbuchstaben von LIB-HOME mit dem c:[Enter]
cd LIB-HOME\lib[Enter]
make-lib[Enter]
----> Jubel, Jubel.
Die Asuro-LIB ist übersetzt. Und alle notwendigen Dateien sind auch in die richtigen Lieblingsverzeichnisse unter GCC-HOME kopiert worden.. (hoffentlich)
Und nun noch die eigenen Programme:
Das hast du ja raus, denke ich.
Uff, das war’s.
Gruß Sternthaler
P.S.: Falls weitere Fragen auftauchen, Frag einfach.
Lest es euch in Ruhe durch. Es darf auch 2- oder 3-mal sein, da es ja möglicherweise nicht ganz einfach zu verstehen ist.
Lesezeichen