How to tell where a header file is included from?

C++CGccIncludeG++

C++ Problem Overview


How can I tell where g++ was able to find an include file? Basically if I

#include <foo.h>

g++ will scan the search path, using any include options to add or alter the path. But, at the end of days, is there a way I can tell the absolute path of foo.h that g++ chose to compile? Especially relevant if there is more than one foo.h in the myriad of search paths.

Short of a way of accomplishing that... is there a way to get g++ to tell me what its final search path is after including defaults and all include options?

C++ Solutions


Solution 1 - C++

g++ -H ...

will also print the full path of include files in a format which shows which header includes which

Solution 2 - C++

This will give make dependencies which list absolute paths of include files:

gcc  -M showtime.c

If you don't want the system includes (i.e. #include <something.h>) then use:

gcc  -MM showtime.c

Solution 3 - C++

Sure use

g++ -E -dI  ... (whatever the original command arguments were)

Solution 4 - C++

If you use -MM or one of the related options (-M, etc), you get just the list of headers that are included without having all the other preprocessor output (which you seem to get with the suggested g++ -E -dI solution).

Solution 5 - C++

If your build process is very complicated...

constexpr static auto iWillBreak = 
#include "where/the/heck/is/this/file.h"

This will (almost certainly) cause a compilation error near the top of the file in question. That should show you a compiler error with the path the compiler sees.

Obviously this is worse than the other answers, but sometimes this kind of hack is useful.

Solution 6 - C++

For MSVC you can use the /showInclude option, which will display the files that are included.


(This was stated in a comment of Michael Burr on this answer but I wanted to make it more visible and therefore added it as a separate answer.)


Usability note: The compiler will emit this information to the standard error output which seems to be suppressed by default when using the windows command prompt. Use 2>&1 to redirect stderr to stdout to see it nonetheless.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionharschwareView Question on Stackoverflow
Solution 1 - C++BulletmagnetView Answer on Stackoverflow
Solution 2 - C++SodvedView Answer on Stackoverflow
Solution 3 - C++wallykView Answer on Stackoverflow
Solution 4 - C++Jonathan LefflerView Answer on Stackoverflow
Solution 5 - C++sudo rm -rf slashView Answer on Stackoverflow
Solution 6 - C++RavenView Answer on Stackoverflow