www.mikrocontroller.net

Forum: Compiler & IDEs Eigene GCC-Libraries generieren


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Peter (Gast)
Datum:

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

Peter

Autor: Peter (Gast)
Datum:

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

Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagt denn

file *.o

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg

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

Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Peter (Gast)
Datum:

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

Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Errm, nein, man sollte schon richtig lesen.

Du sollst das Kommando

file *.o

eingeben.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Dann kannst du die Dateien zumindest mit

avr-objdump -h *.o

verifizieren.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.