I'm using a header only library and would like to include only the part of the library that I'm actually using.
If I include one of the library's headers how can I find all the other headers that are included by the library? Or phrased more generally: how can I find all files that make up a C++ translation unit? (I'm using g++ on Linux.)
gcc -H produces output of the form:
... /usr/include/c++/4.6/cmath
.... /usr/include/math.h
..... /usr/include/x86_64-linux-gnu/bits/huge_val.h
..... /usr/include/x86_64-linux-gnu/bits/huge_valf.h
You have to filter out the system headers manually, though.
gcc -E gives you the raw preprocessor output:
# 390 "/usr/include/features.h" 2 3 4
# 38 "/usr/include/assert.h" 2 3 4
# 68 "/usr/include/assert.h" 3 4
extern "C" {
extern void __assert_fail (__const char *__assertion, __const char *__file,
unsigned int __line, __const char *__function)
throw () __attribute__ ((__noreturn__));
You have to parse the linemarkers manually. See: http://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html
gcc -M produces a Make file for the given source file. The output looks as follows:
object.o: mylibrary/object.h /usr/include/c++/4.6/map \
/usr/include/c++/4.6/bits/stl_tree.h \
/usr/include/c++/4.6/bits/stl_algobase.h \
/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++config.h \
I believe you're looking for gcc -H.
g++ -M somefile
to get a makefile that has all files somefile included as dependencies for somefile.o.
g++ -MM somefile
the same, but doesn't list system headers (e.g. anything in /usr/include
or /usr/local/include
).
What do you need this for? If it's for dependency tracking, the above should suffice. If you, on the other hand, want to do some crazy thing like "I include this header and that header includes this header, so I don't need to include it again" - don't. No, seriously. Don't.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With