Headerdateien -> Libraries?



  • Hallo Jungs,
    ich habe mal eine Frage bezüglich Headerdateien... nehmen wir einmal ein simples Beispiel:

    #include <stdio.h>
    int main(void)
    {
       printf("hello world");
      return 0;
    }
    

    Nun includiere ich hier ja die Deklarationen und Definitionen für Funktionen der stdio (Anlegen, Löschen von Dateien, Ausgabe von Text,etc...).

    Damit das Miniprogram die Funktion printf kennt, wird ja die Header-Datei benötigt. Dadurch linkt der Compiler dann entsprechend die richtige Library in der die printf Funktion enthalten ist.

    Nun meine Frage:
    Wie kann ich herausbekommen in welcher Library die printf Funktion enthalten ist und wie kann ich mir den Quellcode dazu ansehen?

    Beim printf ist es ja vielleicht uninteressant, aber wenn ich Funktionen aus Fremdcode aufrufe, möchte ich vielleicht doch mal nachsehen wie das ein oder andere funktioniert....

    Warum liefern die Compiler denn nicht eine dazugehörige stdio.c mit aus, so wie es bei den "eigenen" Projekten ja auch der Fall ist. Dort hat man eine Headerdatei für die Definitionen/Deklarationen und den eigentlichen Code dann in der entsprechenden C-Datei.

    Vielen Dank Jungs 🙂 :xmas2:



  • codefrag schrieb:

    Dadurch linkt der Compiler dann entsprechend die richtige Library in der die printf Funktion enthalten ist.

    Nein, dem Linker ist egal, welche Headers du includierst. Die Header Datei gibt nicht die Information, gegen welche Libs gelinkt werden soll.

    codefrag schrieb:

    Nun meine Frage:
    Wie kann ich herausbekommen in welcher Library die printf Funktion enthalten ist und wie kann ich mir den Quellcode dazu ansehen?

    das ist nicht einfach, denn der Bibliothek Name muss nicht mit dem Headerdatei Name übereinstimmen. Die Funktion printf ist bspweise nicht in libstdio.so bzw. stdio.dll sondern kommt in der Standard C Runtime Library (unter Unix und Derivate zum Beispiel die Glibc/UcLibC).

    Wenn du an einer Funktion aus einer beliebigen Bib interessiert bist, wird das schwieriger sein, denn unterschiedliche Bibs können gleiche Namen für ihre Funktionen benutzen, d.h. selbst wenn du die .so bzw. .dll Dateien anschaust und nach dem Vorkomen des Strings "meine_funktion" suchst, muss nicht unbedingt die gewünschte Funktion der gewünschten Bibliothek sein, wenn du einen Treffen hast.

    An der Stelle würde ich sagen RTFM, sprich, solche Information bekommst du eigentlich nur aus der jeweiligen Dokumentation der Bibliothek (meistens, wo man erfährt, wie man gegen diese Bib linken muss).

    codefrag schrieb:

    Beim printf ist es ja vielleicht uninteressant, aber wenn ich Funktionen aus Fremdcode aufrufe, möchte ich vielleicht doch mal nachsehen wie das ein oder andere funktioniert....

    Ich nehme an, dass printf nichts anders als ein Wrapper für sprintf oder snprintf ist, aber diese Funktionen wären schon mal interessant, bei so vielen Formatmöglichkeiten.

    Wenn du aber nur über die fertige Bibliothek verfügst, dann kannst du nicht den Quellcode anschauen, das geht leider nicht. Gerade bei Windows kann das schade sein, wenn man vom Software Hersteller nur die fertige DLLs bekommt. Da hast du keine Chance an den Quellcode zu kommen, außer die veröffentlichen ihn. Wenn du an einer printf Implementierung interessiert bist, würde ich mir die GNU Glibc oder uClibc anschauen, ihr Quellcode ist im Internet frei verfügbar.

    codefrag schrieb:

    Warum liefern die Compiler denn nicht eine dazugehörige stdio.c mit aus, so wie es bei den "eigenen" Projekten ja auch der Fall ist. Dort hat man eine Headerdatei für die Definitionen/Deklarationen und den eigentlichen Code dann in der entsprechenden C-Datei.

    Weil es 1. mit dem Compiler nichts zu hat und 2. weil es nicht immer gewünscht ist, dass die Kunden den Quellcode kennen. Z.b. DirectX.

    Außerdem gibt es zig tausende Bibliotheken, es wäre ein Chaos, wenn ein Compiler den Quellcode von sämtlichen Bibliotheken mitliefern würde, außerdem würdest du viel Zeit beim kompilieren verschwenden: linken geht deutlich schneller als kompilieren.
    Stell dir vor, du hast eine Bibliothek liba, die 1 Stunde zum Kompilieren braucht. Wenn du 3 Projekte hast, die liba benutzen und jedes Projekt 1 Minute zum Kompilieren und linken brauchen, dann bist du in 3 Minuten fertig. Müsstest du jedes Projekt zusammen mit liba kompilieren, wärst du in 3 Stunden fertig.

    Außerdem ist das genau der Sinn eine Bibliothek, dass du den Quellcode nicht brauchst, um ihre Klassen/Strukturen, Konstanten, Variable, Funktionen usw. zu benutzen.



  • supertux schrieb:

    codefrag schrieb:

    Dadurch linkt der Compiler dann entsprechend die richtige Library in der die printf Funktion enthalten ist.

    Nein, dem Linker ist egal, welche Headers du includierst. Die Header Datei gibt nicht die Information, gegen welche Libs gelinkt werden soll.

    Hi supertux,
    vielen Dank für deine ausführliche Antwort... ich habe alles verstanden bis auf das ...

    Woher weiss der Compiler/Linker dann aus welchen Libs er sich die Funktionen beziehen kann? Beim Visual Studio ist die Suchreihenfiolge ja fest vorgeben (Ordner, System, etc..) schaut der sich dann wirklich jede Lib im Ordner an und sucht sich dann das Richtige?

    Das würde aber wiederum nicht funktionieren, wenn Funktionen in verschiedenen Libs den gleichen Namen haben.

    Vielen Dank 😕



  • Bei den Standard-Headern hat der Compiler vermutlich eine Liste, wo er die benötigten Libraries findet. Bei eigenen Bibliotheken sieht die Lösung ganz einfach aus: Du sagst dem Linker, welche Bibliotheken er verwenden soll (wenn eine verwendete Funktion dabei doppelt oder gar nicht auftaucht, bricht er mit einer netten Fehlermeldung ab).



  • CStoll schrieb:

    Bei den Standard-Headern hat der Compiler vermutlich eine Liste, wo er die benötigten Libraries findet.

    Ich weiß nicht, was der Microsoft C/C++ Compiler macht, aber ich denke, dass der Compiler automatisch gegen die Runtime C Library linkt, zumindest habe ich dieses Verhalten am GNU GCC gesehen, aber das ist nur reine Vermutung.

    Woher weiss der Compiler/Linker dann aus welchen Libs er sich die Funktionen beziehen kann? Beim Visual Studio ist die Suchreihenfiolge ja fest vorgeben (Ordner, System, etc..) schaut der sich dann wirklich jede Lib im Ordner an und sucht sich dann das Richtige?

    Der Linker weiß es nicht, du musst ihm das sagen, wie CStoll es bereits gesagt hat. Bei dem Linker vom GNU GCC musst du z.b. mit den Optionen -L und -l arbeiten, was du beim Visual Studio machen musst, weiß ich leider nicht. Aber ich glaube, da gibt es ein Menü, wo du einem Projekt eine Bibliothek hinzufügen kannst, oder so. Damit weiß die IDE beim Linken, wie sie den Linker aufrufen soll.


Anmelden zum Antworten