@all GCC-Insider! 1. Wie kann ich mit avr-ar meine eigenen libraries generieren? Leider ist im AVR-GCC-Tutorial nichts zu diesem Thema nachzulesen. Versuche mit "avr-ar m mylib.lib filename.o" scheitern mit der Fehlermeldung: avr-ar: no entry filename.o in archive mylib.lib (avr-ar befindet sich im gleichen Projektordner wie die *.o-Files). 2. Wo im Makefile muss ich dann meine library eintragen? Bedanke mich schon mal für evtl. Hilfe Peter
Wie kommst du gerade auf die Option -m?
Mein Manual sagt dazu "move members in archive", logischerweise
sollten sie dafür wohl erst mal da sein...
ar -rv ist das, was ich so als Standardoptionen in Erinnerung
habe.
Der übliche Suffix für Bibliotheken ist übrigens .a.
> Wo im Makefile muss ich dann meine library eintragen?
Irgendwo bei den Linkeroptionen, LDFLAGS zum Beispiel. Sieht so aus,
als hätte das Standard-Template dafür noch keine Vorkehrungen.
Sinnvoll wäre eine Vorgehensweise wie:
LOCAL_LIBS=foo.a bar.a
...
LDFLAGS = ...
...
LDFLAGS += ${LOCAL_LIBS}
Es könnte auch sein, dass GNU make standardmäßig (also ohne Eintrag
bei LDFLAGS) eine Variable namens LDLIBS in das Linker-Kommando mit
aufnimmt, da bin ich mir gerade nicht im Klaren.
Hallo Jörg, danke für die schnelle Antwort! Die Option m steht für "move file<s> in the archive" 73 de Peter DF8XA
Yup, aber dafür musst du ja erstmal eine Datei im Archiv haben. Du hast das wohl mit "move in*to* the archive" verwechselt. ;-)
Versteh ich nicht!? Das Archiv ist doch meine library oder wie? Peter
Ach soooooo! Diese Option "bewegt" Dateien innerhalb des Archiv! Aber mit welcher Option bekomme ich dann eine Datei in das Archiv? Peter
Schrob ich doch, mit "r". Auch wenn das replace heißt, die beklagt sich nicht, wenn es noch nichts zu ersetzen gibt, sondern fügt den entsprechenden Modul stillschweigend dann ein. Ist auch so in der man page dokumentiert.
Die Option "r" habe ich auch schon getestet, aber dann meckert das Programm mit:"File format not recognized". Welches Format muss denn eine Datei haben damit das Programm nicht meckert? Ich wollte einige *.o-Dateien in die library packen! Peter
.o-Dateien sind OK. Nimmst du den passenden avr-ar zu den passenden .o-Dateien? Der native ar wird's unter Umständen nicht tun.
Wie hast du die .o-Dateien denn erstellt? Vielleicht beim Compilieren das -c vergessen oder so?
@ Jörg Ich nehme den aus dem Installationspaket! @Rolf So sehen meine Compiler-Flags aus: # Compiler flags. # -g*: generate debugging information # -O*: optimization level # -f...: tuning, see GCC manual and avr-libc documentation # -Wall...: warning level # -Wa,...: tell GCC to pass this to the assembler. # -adhlns...: create assembler listing CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) $(CINCS) CFLAGS += -O$(OPT) CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums CFLAGS += -Wall -Wstrict-prototypes CFLAGS += -Wa,-adhlns=$(<:.c=.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) CFLAGS += $(CSTANDARD) wo muss den das -c hingesetzt werden? Peter
@ Rolf oder meinst du diese Flag's? # Compile: create object files from C source files. %.o : %.c @echo @echo $(MSG_COMPILING) $< $(CC) -c $(ALL_CFLAGS) $< -o $@ Peter
@Rolf Diese Flags habe ich auch noch in meinem make gefunden: # Compiler flags to generate dependency files. GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d Peter
Die Ausgabe des Kommandos "file *.o" (ohne die Anführungs- zeichen).
Du meinst, ich soll ein Kommando eingeben: avr-ar file *.o ????? Peter
Errm, nein, man sollte schon richtig lesen. Du sollst das Kommando file *.o eingeben.
Hmpf, das file-Kommando liefert WinAVR wohl nicht mit, schade. Dann kannst du die Dateien zumindest mit avr-objdump -h *.o verifizieren.
@Jörg DANKE!!! Kanst du mir bitte erhlären, warum es nach avr-objdump -h *.o funktioniert? Dieses -h ist doch nur eine "zeige was auf dem Display an" Option. Aber danach kann ich die gewünschten .o-Dateien in meine library aufnehmen! Eine Frage noch: Wie binde ich jetzt meine library in mein makefile ein? Peter
@Jörg also, vielen Dank für deine Unterstützung. Habe es geschafft, mit der von dir oben beschriebenen Änderung im Makefile, LOCAL_LIBS = my_m8_lib.a ... LDFLAGS = ... ... LDFLAGS += ${LOCAL_LIBS} meine eigene library einzubinden! Blöd ist nur, dass der Linker alle Funktionen mit einbindet auch die, die in meinem Programm nicht aufgerufen werden! D A N K E Peter (DF8XA)
> Blöd ist nur, dass der Linker alle Funktionen mit einbindet auch > die, die in meinem Programm nicht aufgerufen werden! Haben wir schon x-mal hier durchgekaut: er bindet nicht alle Funktionen mit ein, sondern alle Module, die benötigt werden, um undefinierte Symbole aufzulösen. Alle voneinander unabhängigen Funktionen schreibt man daher zweckmäßigerweise in jeweils separate C-Dateien, damit sie getrennte Objektcode-Module in der Bibliothek ergeben.
> Alle voneinander unabhängigen Funktionen schreibt man daher > zweckmäßigerweise in jeweils separate C-Dateien, damit sie > getrennte Objektcode-Module in der Bibliothek ergeben. Alternativ implementiert man sie gleich im Header und macht sie static. Das gibt dem Compiler zusätzlich die Möglichkeit, inlining zu betreiben, wenn er es für sinnvoll erachtet. Funktionen, die nicht gebraucht werden, verschwinden in diesem Fall auch dann, wenn sie alle in einem File implementiert sind, da das dann bereits der Compiler macht und nicht der Linker.
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.