Как я могу найти заголовочные файлы языка программирования C в Linux?
Когда я пишу программы C в Linux, а затем компилирую их с помощью gcc, мне всегда интересно, где эти файлы заголовков. Например, где stdio.h
. В более общем плане, где stdbool.h
?
То, что я хочу знать, не только там, где оно есть, но и как получить эти места, например, используя команду оболочки или используя язык программирования C.
Ответы
Ответ 1
gcc -H ...
будет печатать полный путь каждого включаемого файла в качестве побочного эффекта обычной компиляции. Используйте -fsyntax-only
в дополнение к тому, чтобы не создавать какой-либо вывод (он все равно скажет вам, есть ли в вашей программе ошибки). Пример (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
Точки в начале каждой строки подсчитывают, насколько глубоко вложен #include
.
Ответ 2
Если вы используете gcc, вы можете проверить конкретный файл с чем-то вроде:
echo '#include <stdbool.h>' | cpp -H -o /dev/null 2>&1 | head -n1
-H
просит препроцессор рекурсивно печатать все включенные файлы. head -n1
берет только первую строку вывода из этого, чтобы игнорировать любые файлы, включенные именованным заголовком (хотя, вероятно, stdbool.h, вероятно, не работает).
На моем компьютере, например, выходы выше:
. /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stdbool.h
Ответ 3
locate stdio.h
или
mlocate stdio.h
но locate
полагается на базу данных, если вы ее никогда не обновляли
sudo updatedb
вы также можете запросить gcc
, чтобы узнать, какие каталоги по умолчанию сканируются самим gcc
:
gcc -print-search-dirs
Ответ 4
Во время предварительной обработки все директивы препроцессора будут заменены действиями. Как расширение макросов, удаление комментариев кода, включая исходный код заголовка и т.д.
мы можем проверить его, используя команду "CPP" - C PreProcessor.
Например, в командной строке
cpp Filename.c
Он отобразит предварительно обработанный вывод.
Ответ 5
Один подход, если вы знаете имя файла include, будет использовать find:
cd /
find . -name "stdio.h"
find . -name "std*.h"
Это займет некоторое время, когда оно проходит через все каталоги.
Ответ 6
Используйте gcc -v
, и вы можете проверить путь включения.
Обычно включенные файлы находятся в /usr/include
или /usr/local/include
в зависимости от установки библиотеки.
Ответ 7
Большинство стандартных заголовков хранятся в /usr/include
. Похоже, что stdbool.h
хранится где-то в другом месте и зависит от того, какой компилятор вы используете. Например, g++ хранит его в /usr/include/c++/4.7.2/tr1/stdbool.h
, тогда как clang хранит его в /usr/lib/clang/3.1/include/stdbool.h
.
Ответ 8
Я думаю, что общий путь:
/usr/lib/gcc/$(ls/usr/lib/gcc/)/$(gcc -v 2 > & 1 | tail -1 | awk '{print $3}')/include/stdbool. ч
Ответ 9
Когда я искал (на Fedora 25), я использовал "whereis stdio.h". Для меня это было в /usr/include/stdio.h,/usr/shar/man/man3/stdio.3.gx, Но когда вы ищете файл, используйте whereis или найдите
Ответ 10
Используйте vim, чтобы открыть ваш исходный файл и поместить проклятия в stdio.h, а в обычном режиме команда ' gf ' позволит vim открыть файл stdio.h для вас.
Ctr + g позволит vim отобразить абсолютный путь к stdio.h