Yishu Fang
Yishu Fang

Reputation: 9958

How can I find the header files of the C programming language in Linux?

When I write C programs in Linux, and then compile them using gcc, I am always curious about where those header files are. For example, where stdio.h is. More generally, where is stdbool.h?

What I want to know is not only where it is, but also how to get those places, for example, using shell command or using the C programming language.

Upvotes: 87

Views: 119076

Answers (10)

Sankar Mani
Sankar Mani

Reputation: 178

During the preprocessing all preprocessor directives will be replaced with the actuals. Like macro expansion, code comment removal, including the header file source code etc...

we can check it by using the cpp - C PreProcessor command.

For example in the command line:

cpp Filename.c

displays the preprocessed output.

Upvotes: 7

Alvin Z
Alvin Z

Reputation: 11

Use vim to open your source file and put the curses on stdio.h and in normal mode, command 'gf' will let vim open the stdio.h file for you.

'Ctr + g' will let vim display the absolute path of stdio.h

Upvotes: 0

Jordan
Jordan

Reputation: 54

When I was looking for (on Fedora 25) I used "whereis stdio.h" For me, It was in /usr/include/stdio.h, /usr/shar/man/man3/stdio,3.gx. But when you are looking for the file, use whereis or locate

Upvotes: 0

guz
guz

Reputation: 1389

locate stdio.h

or

mlocate stdio.h

but locate relies on a database, if you have never updated it

sudo updatedb

you can also enquire gcc to know what are the default directories that are scanned by gcc itself:

gcc -print-search-dirs

Upvotes: 33

zwol
zwol

Reputation: 140445

gcc -H ... will print the full path of every include file as a side-effect of regular compilation. Use -fsyntax-only in addition to get it not to create any output (it will still tell you if your program has errors). Example (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

The dots at the beginning of each line count how deeply nested the #include is.

Upvotes: 95

aschepler
aschepler

Reputation: 72271

If you use gcc, you can check a specific file with something like:

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

-H asks the preprocessor to print all included files recursively. head -n1 takes just the first line of output from that, to ignore any files included by the named header (though stdbool.h in particular probably doesn't).

On my computer, for example, the above outputs:

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

Upvotes: 45

Josmar
Josmar

Reputation: 584

I think the generic path is:

/usr/lib/gcc/$(ls /usr/lib/gcc/)/$(gcc -v 2>&1 | tail -1 | awk '{print $3}')/include/stdbool.h

Upvotes: 1

Xymostech
Xymostech

Reputation: 9850

Most standard headers are stored in /usr/include. It looks like stdbool.h is stored somewhere else, and depends on which compiler you are using. For example, g++ stores it in /usr/include/c++/4.7.2/tr1/stdbool.h whereas clang stores it at /usr/lib/clang/3.1/include/stdbool.h.

Upvotes: 1

Marvo
Marvo

Reputation: 18133

One approach, if you know the name of the include file, would be to use find:

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

That'll take a while as it goes through every directory.

Upvotes: 6

Summer_More_More_Tea
Summer_More_More_Tea

Reputation: 13356

Use gcc -v and you can check the include path. Usually, the include files are in /usr/include or /usr/local/include depending on the library installation.

Upvotes: 2

Related Questions