webentwicklung-frage-antwort-db.com.de

Wo werden Include-Dateien gespeichert - Ubuntu Linux, GCC

Wenn wir also Folgendes tun:

#include <stdio.h>

versus

#include "myFile.h"

der Compiler, in meinem Fall GCC, weiß, wo sich stdio.h (und sogar die Objektdatei) auf meiner Festplatte befinden. Es nutzt nur die Dateien ohne Interaktion von mir.

Ich denke , dass die Dateien auf meinem Ubuntu Linux-Rechner unter /usr/include/ Gespeichert sind. Woher weiß der Compiler, wo er nach diesen Dateien suchen muss? Ist dies konfigurierbar oder ist dies nur die erwartete Standardeinstellung? Wo würde ich nach dieser Konfiguration suchen?

Woher stammen die Dateien, da ich eine Frage zu diesen Include-Dateien stelle? Ich weiß, dass dies in der Linux-Community möglicherweise unscharf ist, aber wer verwaltet diese? Wer würde die gleichen Dateien für einen Windows-Compiler bereitstellen und verwalten?.

Ich hatte immer den Eindruck, dass sie mit dem Compiler kommen , aber das war eine Annahme ...

67
Frank V

Siehe hier: Suchpfad

Zusammenfassung:

#include <stdio.h>

Befindet sich die Include-Datei in Klammern, sucht der Präprozessor zunächst in Pfaden, die mit dem Flag I angegeben wurden. Anschließend werden die Standard-Include-Pfade durchsucht (siehe den obigen Link und verwenden Sie das Flag v, um auf Ihrem System zu testen).

#include "myFile.h"

Wenn die Include-Datei in Anführungszeichen steht, sucht der Präprozessor zuerst im aktuellen Verzeichnis, dann in Pfaden, die durch iquote, dann I und dann in den Standardpfaden angegeben sind .

nostdinc kann verwendet werden, um zu verhindern, dass der Präprozessor die Standardpfade überhaupt durchsucht.

mgebungsvariablen kann auch zum Hinzufügen von Suchpfaden verwendet werden.

Wenn Sie beim Kompilieren das Flag v verwenden, werden die verwendeten Suchpfade angezeigt.

45
Karl Voigtland

gcc ist ein reichhaltiges und komplexes "Orchestrierungs" -Programm, das viele andere Programme aufruft, um seine Aufgaben zu erfüllen. Um genau zu sehen, wo #include "goo" Und #include <zap> Auf Ihrem System suchen, empfehle ich:

$ touch a.c
$ gcc -v -E a.c
 ...
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-Apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
# 1 "a.c"

Auf diese Weise können Sie die Suchlisten nach eingeschlossenen Dateien anzeigen, einschließlich (eventueller) Verzeichnisse, in denen #include "..." Angezeigt wird, #include <...> Jedoch nicht. Diese spezielle Liste, die ich zeige, ist eigentlich auf Mac OS X (auch bekannt als Darwin), aber die von mir empfohlenen Befehle zeigen Ihnen die Suchlisten (sowie interessante Konfigurationsdetails, die ich hier durch ... Ersetzt habe; - ) auf jedem System, auf dem gcc ordnungsgemäß ausgeführt wird.

43
Alex Martelli

Karl hat Ihre Frage zum Suchpfad beantwortet, aber was die "Quelle der Dateien" betrifft, sollten Sie beachten, dass Sie das libfoo -Paket installieren und etwas damit entwickeln möchten (d. H , benutze die Überschriften), du musst auch libfoo-dev. Die Standard-Bibliotheks-Header-Dateien befinden sich bereits in /usr/include, wie du gesehen hast.

Beachten Sie, dass einige Bibliotheken mit vielen Headern diese in einem Unterverzeichnis installieren, z. B. /usr/include/openssl. Um einen davon einzuschließen, geben Sie einfach den Pfad ohne das /usr/include Teil, zum Beispiel:

#include <openssl/aes.h>
10

Die \#include - Dateien von gcc werden in /usr/include Gespeichert. Die Standard-Include-Dateien von g ++ sind in /usr/include/c++ Gespeichert.

2
Manish Bhadani