Eigene GCC-Libraries generieren

Gast #238601
@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
Moderator Persönliche Seite #238602
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.
Gast #238608
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
Gast #238611
@ 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
Gast #238612
@ 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
Gast #238613
@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
Gast #238621
@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
Gast #238622
@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)
Moderator Persönliche Seite #238623
> 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.
Gast #238624
> 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.

Antwort schreiben

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.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.