@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.
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
@ 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
@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.
Eine eigene Frage?
Dieser Thread ist über 21 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.