Frage zu selbsterstellten C-Libs

Gast #155005
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
Gast
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.
Gast
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
Gast
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 ;-)
Gast
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.
Gast
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
Gast
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
Gast
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
Gast
@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

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.