【问题标题】:How to find all files that constitute a translation unit in C++?如何在 C++ 中查找构成翻译单元的所有文件?
【发布时间】:2013-02-04 09:51:25
【问题描述】:

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

如果我包含库的一个标头,我如何才能找到该库包含的所有其他标头?或者更笼统地说:如何找到构成 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 \
    

【问题讨论】:

标签: c++


【解决方案1】:

我相信你正在寻找gcc -H

【讨论】:

    【解决方案2】:

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

    g++ -MM somefile 相同,但不列出系统标头(例如 /usr/include/usr/local/include 中的任何内容)。

    你需要这个做什么?如果是用于依赖跟踪,以上内容就足够了。另一方面,如果你想做一些疯狂的事情,比如“我包含这个标题,那个标题包含这个标题,所以我不需要再次包含它” - 不要。不,认真的。不要。

    【讨论】:

    • 这只给了我直接包含的标题。
    • @BernhardKausler 你确定吗?再检查一遍。当我尝试它时,它给了我所有直接或间接包含的标题。
    • @BernhardKausler -M 给出了编译器为编译源文件而读取的所有文件。
    • @Cubic 和 James:你是对的。我尝试了-MM,它删除了已安装库的所有标头。 -M 选项如您所说。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的提示!不幸的是,“#include”在预处理器之后消失了。但是您可以从预处理器插入的线标记中恢复该信息。见:gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html
    • 您能否相应地更新您的答案以便我接受? :)
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 2021-05-25
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      相关资源
      最近更新 更多