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
Warum hast Du es nicht ins GCC-Forum gestellt? Da gehört es hin! Gruß, Michael
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.
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
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 ;-)
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.
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
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
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.