Wie finde ich die Header-Dateien der Programmiersprache C unter Linux?

Lesezeit: 5 Minuten

Benutzeravatar von Yishu Fang
Yishu Fang

Wenn ich C-Programme unter Linux schreibe und sie dann mit gcc kompiliere, bin ich immer neugierig, wo sich diese Header-Dateien befinden. Wo zum Beispiel stdio.h ist. Allgemeiner, wo ist stdbool.h?

Was ich wissen möchte, ist nicht nur, wo es ist, sondern auch, wie man diese Orte bekommt, zum Beispiel mit Shell-Befehlen oder mit der Programmiersprache C.

Benutzeravatar von twol
zwöl

gcc -H ... wird den vollständigen Pfad jeder Include-Datei als Nebeneffekt der regulären Kompilierung ausgeben. Verwenden -fsyntax-only zusätzlich dazu, dass es keine Ausgabe erzeugt (es wird Ihnen immer noch sagen, ob Ihr Programm Fehler hat). Beispiel (Linux, gcc-4.7):

$ cat > test.c
#include <stdbool.h>
#include <stdio.h>
^D
$ gcc -H -fsyntax-only test.c
. /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdbool.h
. /usr/include/stdio.h
.. /usr/include/features.h
... /usr/include/x86_64-linux-gnu/bits/predefs.h
... /usr/include/x86_64-linux-gnu/sys/cdefs.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/gnu/stubs.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h
.. /usr/include/x86_64-linux-gnu/bits/types.h
... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/bits/typesizes.h
.. /usr/include/libio.h
... /usr/include/_G_config.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h
.... /usr/include/wchar.h
... /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h
.. /usr/include/x86_64-linux-gnu/bits/stdio_lim.h
.. /usr/include/x86_64-linux-gnu/bits/sys_errlist.h

Die Punkte am Anfang jeder Zeile zählen, wie tief die verschachtelt sind #include ist.

  • Danke für die tolle Antwort. Ich war ein wenig verwirrt über die Punkte, deshalb möchte ich teilen, um anderen zu helfen: Die Dateien mit n + 1 Punkten davor werden direkt von der nächsten vorhergehenden Datei mit n Punkten davor eingeschlossen. Wählen Sie also zB eine mit drei Punkten aus, die von der nächstvorhergehenden Datei mit zwei Punkten davor eingeschlossen wird. HTH

    – basteln.online

    23. Oktober 2016 um 16:33 Uhr

  • Mehr über diese Punkte … Sie werden transitive Abhängigkeiten genannt – ein Begriff, der der Mathematik entlehnt ist, um die Beziehung von Dingen auf einer metaphorischen Kette zu beschreiben: a bezieht sich auf b und b bezieht sich auf c, also bezieht sich a auf c und so weiter. Ersetzen a mit deinem Programm u betrifft mit “enthält”.

    – Jonathan Komar

    29. September 2019 um 17:07 Uhr


  • Funktioniert auch unter OS X

    – Ulysse BN

    11. März um 11:35 Uhr

Wenn Sie gcc verwenden, können Sie eine bestimmte Datei mit etwas wie:

echo '#include <stdbool.h>' | cpp -H -o /dev/null 2>&1 | head -n1

-H fordert den Präprozessor auf, alle enthaltenen Dateien rekursiv zu drucken. head -n1 nimmt nur die erste Zeile der Ausgabe davon, um alle Dateien zu ignorieren, die im benannten Header enthalten sind (obwohl dies insbesondere bei stdbool.h wahrscheinlich nicht der Fall ist).

Auf meinem Computer werden beispielsweise die obigen Ausgaben ausgegeben:

. /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdbool.h

  • Rufen Sie für ein Äquivalent mit Clang den Compiler wie folgt auf (mittlerer Teil der Pipeline): cpp -H -fsyntax-only - 2>&1 1>/dev/null Beachte die Bedeutung des Bindestrichs stdin ist Ihre Quelldatei. Ich musste die Umleitungen so machen, weil -o hat es mir schwer gemacht.

    – Damian Pollet

    1. September 2020 um 14:03 Uhr


Benutzeravatar von guz
guz

locate stdio.h

oder

mlocate stdio.h

aber locate stützt sich auf eine Datenbank, wenn Sie diese noch nie aktualisiert haben

sudo updatedb

du kannst dich auch erkundigen gcc um zu erfahren, nach welchen Standardverzeichnissen gescannt wird gcc selbst:

gcc -print-search-dirs

  • Ähm … ich habe es gerade versucht locate aber bei mir bringt es kein ergebnis. Selbst nach sudo locate update

    – Jack

    26. Oktober 2012 um 1:45 Uhr

  • @Jack auf meiner Distribution sudo locate update kann dies tun, ich erinnere mich nur, dass das, was Dietrich Epp wahr ist, diesen Befehl versucht.

    – guz

    26. Oktober 2012 um 1:49 Uhr

  • gcc -print-search-dirs druckt nur Programm- und Bibliotheksstandorte. Der Header-Suchpfad wird nicht gedruckt.

    – Kevin Cox

    12. August 2013 um 13:13 Uhr

  • Auf welchem ​​System ist locate ein Standard eingebaut?

    – Benutzer3467349

    23. Juni 2017 um 16:05 Uhr

  • @ user3467349 Es ist in Ubuntu 16.04 integriert. Es wird nur einmal am Tag ausgeführt und aktualisiert die Indizes, daher habe ich es so geändert, dass es alle 15 Minuten aktualisiert wird cron.

    – WinEunuuchs2Unix

    17. Juni 2021 um 0:05 Uhr

Benutzeravatar von Sankar Mani
Sankar Mani

Während der Vorverarbeitung werden alle Präprozessoranweisungen durch die tatsächlichen ersetzt. Wie Makroerweiterung, Entfernung von Codekommentaren, einschließlich des Quellcodes der Header-Datei usw.

Wir können es überprüfen, indem wir die verwenden cpp – C PreProcessor-Befehl.

Zum Beispiel in der Kommandozeile:

cpp Filename.c

zeigt die vorverarbeitete Ausgabe an.

Ein Ansatz, wenn Sie den Namen der Include-Datei kennen, wäre die Verwendung von find:

cd /
find . -name "stdio.h"
find . -name "std*.h"

Das wird eine Weile dauern, da es jedes Verzeichnis durchläuft.

  • Es würde nicht schaden, das einzuschränken find zu /usr/include und /usr/liboder verwenden locate stattdessen.

    – Dietrich Ep

    26. Oktober 2012 um 1:45 Uhr

Benutzeravatar von Summer_More_More_Tea
Sommer_Mehr_Mehr_Tee

Verwenden gcc -v und Sie können den Include-Pfad überprüfen. Normalerweise sind die Include-Dateien in /usr/include oder /usr/local/include abhängig von der Bibliotheksinstallation.

  • Es würde nicht schaden, das einzuschränken find zu /usr/include und /usr/liboder verwenden locate stattdessen.

    – Dietrich Ep

    26. Oktober 2012 um 1:45 Uhr

Benutzeravatar von Xymostech
Xymostech

Die meisten Standardheader sind in gespeichert /usr/include. Es sieht aus wie stdbool.h wird woanders gespeichert und hängt davon ab, welchen Compiler Sie verwenden. Zum Beispiel speichert g++ es in /usr/include/c++/4.7.2/tr1/stdbool.h wohingegen clang es bei speichert /usr/lib/clang/3.1/include/stdbool.h.

1416920cookie-checkWie finde ich die Header-Dateien der Programmiersprache C unter Linux?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy