Forum: Compiler & IDEs Eigene GCC-Libraries generieren


von Peter (Gast)


Lesenswert?

@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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Yup, aber dafür musst du ja erstmal eine Datei im Archiv haben.

Du hast das wohl mit "move in*to* the archive" verwechselt. ;-)

von Peter (Gast)


Lesenswert?

Versteh ich nicht!? Das Archiv ist doch meine library oder wie?

Peter

von Peter (Gast)


Lesenswert?

Ach soooooo! Diese Option "bewegt" Dateien innerhalb des Archiv!
Aber mit welcher Option bekomme ich dann eine Datei in das Archiv?

Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

.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.

von Rolf Magnus (Gast)


Lesenswert?

Wie hast du die .o-Dateien denn erstellt? Vielleicht beim Compilieren
das -c vergessen oder so?

von Peter (Gast)


Lesenswert?

@ 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

von Peter (Gast)


Lesenswert?

@ 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

von Peter (Gast)


Lesenswert?

@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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Was sagt denn

file *.o

von Peter (Gast)


Lesenswert?

@Jörg

Was meinst du mit "Was sagt denn file *.o"?

Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Die Ausgabe des Kommandos "file *.o" (ohne die Anführungs-
zeichen).

von Peter (Gast)


Lesenswert?

Du meinst, ich soll ein Kommando eingeben: avr-ar file *.o ?????

Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Errm, nein, man sollte schon richtig lesen.

Du sollst das Kommando

file *.o

eingeben.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hmpf, das file-Kommando liefert WinAVR wohl nicht mit, schade.

Dann kannst du die Dateien zumindest mit

avr-objdump -h *.o

verifizieren.

von Peter (Gast)


Lesenswert?

@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

von Peter (Gast)


Lesenswert?

@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)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Rolf Magnus (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.