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


von Mike (Gast)


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

von MSE (Gast)


Lesenswert?

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

Gruß, Michael

von Malte (Gast)


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.

von Matthias (Gast)


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

von Mike (Gast)


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

von Thomas X. (Gast)


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.

von Matthias (Gast)


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

von Mike (Gast)


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

von Matthias (Gast)


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

von MSE (Gast)


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

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.