gcc -w -H <file>
的输出可能非常有用(如果你解析它并做一些计数),-w
选项用于抑制所有警告,这些警告可能很难处理。
来自于 gcc 文档:
-H
除了其他正常活动外,打印每个头文件使用的名称。 每个名称的缩进显示其在
#include
堆栈中的深度。 即使发现无效的预编译头文件,也会打印预编译头文件;一个无效的预编译头文件将以...x
的形式显示而有效的则为...!
。
输出结果如下:
. /usr/include/unistd.h
.. /usr/include/features.h
... /usr/include/bits/predefs.h
... /usr/include/sys/cdefs.h
.... /usr/include/bits/wordsize.h
... /usr/include/gnu/stubs.h
.... /usr/include/bits/wordsize.h
.... /usr/include/gnu/stubs-64.h
.. /usr/include/bits/posix_opt.h
.. /usr/include/bits/environments.h
... /usr/include/bits/wordsize.h
.. /usr/include/bits/types.h
... /usr/include/bits/wordsize.h
... /usr/include/bits/typesizes.h
.. /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stddef.h
.. /usr/include/bits/confname.h
.. /usr/include/getopt.h
. /usr/include/stdio.h
.. /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stddef.h
.. /usr/include/libio.h
... /usr/include/_G_config.h
.... /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stddef.h
.... /usr/include/wchar.h
... /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stdarg.h
.. /usr/include/bits/stdio_lim.h
.. /usr/include/bits/sys_errlist.h
Multiple include guards may be useful for:
/usr/include/bits/confname.h
/usr/include/bits/environments.h
/usr/include/bits/predefs.h
/usr/include/bits/stdio_lim.h
/usr/include/bits/sys_errlist.h
/usr/include/bits/typesizes.h
/usr/include/gnu/stubs-64.h
/usr/include/gnu/stubs.h
/usr/include/wchar.h
Makefile
,这样就可以在加上那个标志的情况下运行完整的构建...或者添加第二个命令到你的构建规则中,用那个标志运行 gcc 并将其输出重定向到一个文件或其他地方。 - Spudd86-M
或-MM
选项将输出一行所需的信息。(前者包括系统头文件,而后者不包括。还有其他变体,请参见手册。)$ gcc -M -c foo.c
foo.o: foo.c /usr/include/stdint.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
/usr/include/bits/wchar.h
foo.o: foo.c
,但其余部分是该文件依赖的所有头文件的列表,因此编写一个脚本来收集并汇总这些内容不会太难。当然,这个建议仅适用于Unix,并且只有在没有其他更好的想法时才有用。 :-)使用"仅预处理"来查看您的预处理器输出。gcc -E选项,其他编译器也有此功能。
使用预编译头文件。
gcc具有-verbose和--trace选项,这些选项还会显示完整的包含树,MSVC在高级C++属性页下找到/showIncludes选项。
GCC有一个-M
标志,它将输出给定源文件的依赖关系列表。您可以使用这些信息来确定哪些文件具有最多的依赖项,哪些文件最受依赖等。
请查看手册页以获取更多信息。有几个变体的-M
。
就我个人而言,我不知道是否有一种工具可以说“删除这个文件”。这是一个非常复杂的问题,取决于很多因素。查看包含语句树肯定会让你发疯...它也会让我发疯,还会毁了我的眼睛。有更好的方法来减少编译时间。
我听说有一些工具可以做到这一点,但我不使用它们。
我创建了一些工具https://sourceforge.net/p/headerfinder,也许这很有用。不幸的是,这是一个“自制”的工具,存在以下问题: