5

我正在使用仅标头库,并且只想包含我实际使用的库的一部分。

如果我包含库的标题之一,我如何找到该库包含的所有其他标题?或者更笼统地说:我怎样才能找到构成 C++ 翻译单元的所有文件?(我在 Linux 上使用 g++。)

编辑:使用 gcc 的可能方法(答案摘要)

  • gcc -H 产生以下形式的输出:

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

    但是,您必须手动过滤掉系统标头。

  • gcc -E 为您提供原始预处理器输出:

    # 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__));
    

    您必须手动解析线标记。见: http: //gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html

  • gcc -M 为给定的源文件生成一个 Make 文件。输出如下所示:

    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 \
    
4

4 回答 4

4

我相信您正在寻找gcc -H

于 2013-02-04T10:16:37.120 回答
3

g++ -M somefile获取一个 makefile,其中包含所有文件 somefile 作为 somefile.o 的依赖项。

g++ -MM somefile相同,但不列出系统标题(例如/usr/includeor中的任何内容/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.

于 2013-02-04T10:19:47.303 回答
2

您可以使用 GCC 的-E标志获取预处理的源代码,然后将其 grep 用于#include. 我不知道有任何其他方式可以让源文件找到进入翻译单元的方式,所以这应该可以完成工作。

于 2013-02-04T09:54:01.940 回答
2

使用 g++(以及大多数 Unix 编译器,我认为),您可以使用-M. 对于其他编译器,您需要-Eor /E,将输出捕获到文件中,并使用您喜欢的脚本语言对文件进行后处理。(我在我的 makefile 中这样做,以构建依赖项。)

于 2013-02-04T10:14:33.993 回答