Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find all files that constitute a translation unit in C++?

Tags:

c++

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.)

Edit: Possible approaches with gcc (answers summary)

  • 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 \
    
like image 214
Bernhard Kausler Avatar asked Feb 04 '13 09:02

Bernhard Kausler


2 Answers

I believe you're looking for gcc -H.

like image 113
Angew is no longer proud of SO Avatar answered Nov 15 '22 05:11

Angew is no longer proud of SO


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.

like image 37
Cubic Avatar answered Nov 15 '22 04:11

Cubic