mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu selbsterstellten C-Libs


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tag auch,

ich weiss, ist nicht unbedingt die richtige Anlauf-Stelle für C, aber
es ist C für µCs.

Wie handelt ihr das mit selbsterstellten C-Libs? Lieber für jedes
"Thema" eine eigene Lib, oder eine "Universal-Lib"? Soweit ich das
mit den Libs verstanden habe, ist es ja wurscht, wieviele Funktionen in
einer Lib sind, oder? Der Compiler holt sich ja aus der Lib immer nur
die Funktionen, die er braucht, oder?

Und, zweite Frage, wenn ich mich für eine "Universal-Lib" entscheide,
die können doch auch aus mehreren C-Modulen bestehen, oder?

Sorry für die "komischen" Fragen, bin fortgeschrittener C-Anfänger.

Gruß Mike

Autor: MSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum hast Du es nicht ins GCC-Forum gestellt? Da gehört es hin!

Gruß, Michael

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meines wissens werden beim gcc immer alle Funktionen einer Datei in die
compilierte Anwendung übernommen, sobald mindestens eine Funktion
benötigt wird.
Kannst ja mal ausproibieren wie sich die .bin Größe ändert wenn du eine
unbenutzte Funktion im Quelltext hast oder nicht.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

eine Object-Datei (*.o) wird immer komplett dazugelinkt sobald man
diese dem Linker übergibt. Selbst wenn keine Funktion aus dieser
Object-Datei aufgerufen wird. Erstellst du jetzt aus dieser
Object-Datei eine statische Bibliothek (*.a) wird dieses Objektfile nur
dazugelinkt wenn es auch wirklich benötigt wird. Eine solche Bibliothek
(*.a) kann auch mehrere Object-Dateien (*.o) enthalten. Der Linker
sucht sich dann aus diesem Archiv die benötigten Object-Dateien heraus.
Das Linken findet also immer auf Object- und nicht auf Funktionsebene
statt.

Nachdem du jetzt verstanden hast wie der Mechanismus funktioniert mußt
du dich entscheiden wie du vorgehst. Aber üblicherweise erstellt man
eine Bibliothek immer für eine bestimmte Funktion (z.B. libc.a für die
Standardbibliothek, libm.a für Mathematik-Funktionen, libjpeg.a für
jpeg-Datei[de]kompression usw)und in dieser Bibliothek befinden sich
dann eine Menge Object-Dateien.

Matthias

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hä? Ich dachte, das wäre der Vorteil von Libs: Es wird nur die Funktion
verwendet, die tatsächlich gebraucht wird. Sonst machen Libs doch
keinen Sinn, oder?

Gruß Mike

PS: Ich habs in dieses Forum geschrieben, weil es a) um C für µCs geht
und b) in diesem Unterforum mehr los ist als in GCC ;-)

Autor: Thomas X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier werden logische Funktionsgruppen, einzelne Funktionen, Objektfiles
und Libraries etwas durcheinandergebracht.

Wenn du in einem Objektfile mehrere Symbole hast, wird das ganze
Objektfile ins Programm reingelinkt, wenn nur ein Symbol aus dem
Objektfile benötigt wirst.

Eine Library ist im Prinzip nur mehrere zusammengefasste Objektfiles.
Nur diejenigen Objektfiles aus einer Library, welche Symbole enthalten
welche benötigt werden, werden ins Programm reingelinkt.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

schau doch einfach mal in so eine Lib (also ein *.a) rein. Das geht
mittels

avr-ar -t libc.a

Du findest darin eine Menge Object-Dateien mit meist nur einer einzigen
Funktion. Dashalb sieht es für den Benutzer der libc.a so aus als ob nur
die nötigen Funktionen zum Projekt dazugelinkt werden. Wenn aber alle
Funktionen in einer einzigen *.o liegen würden und diese *.o dann in
einem *.a wird wirklich die gesamte *.o dazugelinkt auch wenn nur eine
Funktion aus *.o verwendet wird. Wie ich schrieb:

"Das Linken findet also immer auf Object- und nicht auf
Funktionsebene
statt."

Und falls du neugierug bist:
Die einzelnen Object-Dateien kannst du dann auch per

avr-ar -x libc.a

aus dem Archiv entpacken und dir die darin definierten Symbole mit

avr-nm object.o

anschauen.

Matthias

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mhm... ich glaub, jetzt ist der Aha-Effekt da. Aber nochmal um sicher zu
gehen (sorry, wenn ich nerve):

Das heisst, ich muss für jede Funktion ein C-Modul schreiben. Aus jedem
C-Modul (= einzelne Funktion) wird ein Object-File erstellt. Die Lib
wird aus den Object-Files erstellt. Somit wird immer nur das benötigte
Object-File gelinkt, da es einzeln aus der Lib genommen werden kann.

Hab ich das jetzt richtig wiedergegeben?

Meine Fresse, ist gar nicht so einfach, sich C selber beizubiegen.

Mike

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ja. So ist das.

BTW:
Das hat überhaupt nichts mit der Programmiersprache C zu tun. Das ist
eine Eigenschaft des GNU-Linkers. Wie das beim M$-Gegenstück realisiert
ist kann ich dir nicht sagen.

Matthias

Autor: MSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mike:

"PS: Ich habs in dieses Forum geschrieben, weil es a) um C für µCs
geht
und b) in diesem Unterforum mehr los ist als in GCC ;-)"


zu a) im GCC-Forum auf dieser Seite geht es auch nur um µC-Compiler.
b) im gcc-Forum ist immer dann etwas los, wenn dort einer 'ne Frage
stellt. Ausserdem ist es für weitere Interessenten der Thematik
wesentlich besser, wenn Threads zu bestimmten Themen sich dort finden
lassen, wo sie hingehören.

Gruß, Michael

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.