Wo sind Include-Dateien gespeichert - Ubuntu Linux, GCC

77

Wenn wir also Folgendes tun:

#include <stdio.h>

gegen

#include "myFile.h"

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

Ich denke, dass auf meinem Ubuntu Linux-Computer die Dateien gespeichert sind /usr/include/. 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 war immer unter dem Eindruck , dass sie kommen mit dem Compiler , aber das war eine Annahme ...

Frank V.
quelle

Antworten:

51

Siehe hier: Suchpfad

Zusammenfassung:

#include <stdio.h>

Wenn sich die Include-Datei in Klammern befindet, sucht der Präprozessor zuerst in Pfaden, die über das Flag -I angegeben sind . Anschließend werden die Standard-Include-Pfade durchsucht (siehe obigen Link, und verwenden Sie das Flag -v , um auf Ihrem System zu testen).

#include "myFile.h"

Wenn die Include - Datei ist die Prä - Prozessor sucht zuerst im aktuellen Verzeichnis in Anführungszeichen, dann angegebene Pfade durch -iquote , dann -I Pfade, dann den Standard - Pfade.

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

Umgebungsvariablen können auch zum Hinzufügen von Suchpfaden verwendet werden.

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

Karl Voigtland
quelle
45

gcc ist ein reichhaltiges und komplexes "Orchestrierungs" -Programm, das viele andere Programme aufruft, um seine Aufgaben zu erfüllen. Um zu sehen, wo #include "goo"und #include <zap>auf Ihrem System gesucht wird, 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"

Dies ist eine Möglichkeit, die Suchlisten für enthaltene Dateien anzuzeigen, einschließlich (falls vorhanden) Verzeichnisse, in die gesucht #include "..."wird, aber #include <...>nicht. Diese spezielle Liste, die ich zeige, ist tatsächlich unter Mac OS X (auch bekannt als Darwin), aber die von mir empfohlenen Befehle zeigen Ihnen die Suchlisten (sowie interessante Konfigurationsdetails, durch die ich ...hier ersetzt habe ;-) auf jedem System, auf dem gcc läuft richtig.

Alex Martelli
quelle
4
Können Sie in dem von Ihnen bereitgestellten Beispiel erklären, woher GCC in / Library / Frameworks suchen kann? Angenommen, die Suche in / usr / include und / usr / local / include ist fest codiert, aber woher kommen zusätzliche Verzeichnisse? Aus der Umwelt?
Rlib
10

Karl hat Ihre Frage zum Suchpfad beantwortet, aber was die "Quelle der Dateien" betrifft, sollten Sie sich darüber im Klaren sein, dass Sie, wenn Sie das libfooPaket installieren und damit etwas entwickeln möchten (dh seine Header verwenden), Sie müssen auch installieren libfoo-dev. /usr/includeWie Sie gesehen haben, befinden sich die Standard-Bibliotheks-Header-Dateien bereits in .

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

#include <openssl/aes.h>
Meredith L. Patterson
quelle
4

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

Manish Bhadani
quelle