Moin, erstmal vielen Dank für die vielen Beiträge zu meinen bisherigen Fragen und Problemen. So langsam arbeite ich mich durch. Trotzdem habe ich noch ein Problem: Ich möchte mein Programm modular aufbauen und den Code daher in mehreren C-Dateien unterbringen. Einige von diesen C-Dateien sollen vor dem Link-Vorgang noch in eine Bibliothek zusammen gefasst werden. Dazu habe ich folgende Fragen: 1. Ist es richtig, dass ich eine Bibliothek mit avr-ar.exe erstellen kann und die dann die Endung .a hat? 2. Ist es richtig, dass ich den Linker avr-ld.exe benutzen muss? 3. Wie kann ich dem Linker sagen, dass die Objekt-Dateien und Bibliotheken, die er verwenden soll (wegen der Übersicht) in einer extra Datei notiert sind? Der Linker soll also eine Datei einladen (z.B. link.dat) in der dann alle Objekte und Libs aufgeführt sind. 4. Wie sieht dann so eine Datei aus? Hat das was mit diesen Scripten (-T) zu tun? 5. Was wirft der Linker dann aus und wie mache ich daraus ein Hex-File? Ich danke Euch ! Markus
1) ja 2) jein, laß besser den C-Compiler das Linken anschieben 3) gar nicht (m. W.), nimm ein Makefile und führe die einzelnen Dateinamen auf 4) n. zutr./ Linker scripts kannst Du im Manual nachlesen (genauer: in den info pages), sie beschreiben die Zuordnung der linker sections im Ergebnis 5) ein ELF file, avr-objcopy Aber warum schaust Du Dir nicht die Beispiel-Makefiles an? 3 und 5 erledigen sich eigentlich damit. Hinweis: aus Bibliotheken werden nur die Objektdateien entnommen, die zum Auflösen einer bisher ungelösten externen Referenz dienen. Auf der Kommandozeile angegebene .o Dateien werden dagegen immer vollständig gelinkt. Aus Bibliotheken werden immer komplette Objektdateien eingebunden (oder eben nicht), nicht etwa einzelne Funktionen. Sinnvollerweise schreibt man also pro Funktion eine Quelldatei (sofern nicht gerade Funktionen untrennbar miteinander verbunden sind).
Hallo Jörg, vielen Dank. Genau das ist es eben, warum ich das so machen will. Ich habe inzwischen viel Erfahrung mit größeren Controllern (C167 Infineon). Und die darauf laufenden Applikationen sind so umfangreich, daß ich einzelne Module in Unterordnern programmiere. Und genau aus den genannten Gründen programmiere ich jede Funktion in eine einzelne Datei, es sei denn, sie rufen sich gegenseitig auf und werden daher eh beide benötigt. Diese vielen kleinen C-Dateien compiliere ich dann und lasse eine Bibliothek erstellen. Somit werden später aus dem Modul nur die benötigen Funktionen eingebunden. Die Bibliotheken werden dann in einen extra Ordner für den Linker-Vorgang kopiert. Lediglich die Objekt-Datei, die die main-Fkt enthält, linke ich direkt als Obj-Datei dazu, damit der Linker den Einsprung findet. Und das Versuche ich nun für den Atmel nachzubilden. Leider noch ohne erfolg. Mit den Makefiles komme ich noch nicht so zu recht, weil ich bislang die Syntax der Datei nicht verstehe. Darum habe ich mich erstmal um die Schalter und Optionen des Compilers und des Linkers gekümmert. Könntest Du mir vielleicht mal ein kleines Makefile generieren, daß zwei C-Dateien kompiliert und in einer Bibliothek zusammen faßt? Thanx Markus
Das folgende Makefile verläßt sich ziemlich stark auf das eingebaute Wissen von »make«. Versuche es mal bei Gelegenheit, anhand der Doku zu verstehen. Getestet mit BSD make und GNU make, müßte eigentlich auch mit SysV make gehen. ;-) Statt Kopieren der Zielbibliothek ist es effektiver, den anderen Jobs ein -L<verzeichnisname> mit auf den Weg zu geben. Mit untenstehender Namenswahl kannst Du die erzeugte Bibliothek dann mit -lmyutils linken lassen. CC=avr-gcc AR=avr-ar RM=rm -f CFLAGS=-mmcu=at90s8515 -O # was auch immer Du noch brauchst MYLIB=libmyutils.a SRCS=foo.c bar.c OBJS=${SRCS:.c=.o} all: ${MYLIB} ${MYLIB}: ${OBJS} ${AR} ${ARFLAGS} ${MYLIB} $? # ^^^ das hier muß ein TAB sein. clean: ${RM} ${OBJS} ${MYLIB} # ^^^ das auch
Hmm, die TABs kommen nicht sehr gut hier. Daher nochmal: vor den ${AR} und ${RM} muß ein TAB stehen, keine Leerzeichen. Alles andere als derartige Kommandos gehört in einem Makefile nicht mit TABs eingerückt (da man Leerzeichen leicht mit TABs verwechselt, rückt man alles andere am besten gar nicht ein).
hallo markus, das mit den bibliotheken könnte wie von jörg vorgeschlagen funktionieren. aber der sinn ist mir noch nicht klar. ich habe einmal eine makedatei angehangen, die drei dateien kompiliert. es werden nur die dateien kompiliert und eingebunden, die ab zeile 12 eingetragen sind. das sollte in etwa das sein, was du brauchst. die verzeichnisse hänge ich gezipt an. du musst in verz_main nur make aufrufen. das ergebnis ist verz_main.bin, mit dem format srec. obj_copy kann aber auch binary, daher meine bezeichnung *.bin die dateien stehen in unterschiedlichen verzeichnissen. alle zwischendateien stehen in einem extra verzeichnis. zum kopieren wird cp von cygwin verwendet, evtl. ändern. wenn du kein laufwerk d: zur verfügung hast, musst du die pfade noch ändern. sollte das alles nicht ganz klar sein, sende doch bitte ein paar dateien, die kompiliert werden sollen. ist leider etwas spät geworden, ich hoffe, das ich mich halbwegs verständlich ausdrücken konnte. ORYX
Hallo, kann mir eigentlich noch mal eben jemand sagen, wie ich diesen Fehler töten kann: warning: no newline at end of file ???? Danke. Das nervt nämlich! Markus
Ja, die Datei mit einer vollständigen Zeile beenden. ;-) D. h., wenn Du mit dem Cursor an das Ende der Datei gehst, muß der auf einer leeren Zeile für sich stehen, nicht etwa am Ende der letzten Zeile, die noch andere Zeichen enthält.
Welchen Sinn? Daß man vollständige Zeilen schreibt? Das ist außerhalb der Wintel-Welt schlicht üblich. ;-)
Wenn mich nicht alles täuscht, schreibt der C-Standard sogar vor, daß ein C-Programm aus Zeilen besteht. Folglich ist ein fehlendes Newline am Ende strikt genommen ein Syntaxfehler.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.