关于C#:如何在Linux上查找大型项目的标头依赖项

关于C#:如何在Linux上查找大型项目的标头依赖项

How to find header dependencies for large scale projects on linux

我正在处理一个非常大型的项目,其中的编译时间很长。我可以在Linux上使用哪些工具(最好是开放源代码)来查找包含最多的文件并优化其使用率?
为了更清楚一点,我需要一个工具,该工具会在给定依赖关系的情况下,向我显示最包含哪些标头。顺便说一下,我们确实使用了分布式编译


这里的答案将为您提供跟踪#include依赖关系的工具。但是没有提到优化之类的东西。

此外:"大型C软件设计"这本书应该有所帮助。


签出makdepend


使用Unix哲学"将许多小工具粘合在一起",我建议编写一个简短的脚本,该脚本使用-M(或-MM)和-MF(OUTFILE)选项调用gcc(如此处所述)。这将生成make工具的依赖项列表,您可以轻松地对其进行解析(相对于直接解析源文件)并提取出所需的信息。


从源树的根目录执行以下操作(\\\\ t为制表符):

1
2
3
4
5
6
find . -exec grep '[ \\t]*#include[ \\t][ \\t]*["<][^">][">]' {} ';'
    | sed 's/^[ \\t]*#include[ \\t][ \\t]*["<]//'
    | sed 's/[">].*$//'
    | sort
    | uniq -c
    | sort -r -k1 -n

第1行获取所有包含行。
第2行去除了实际文件名之前的所有内容。
第3行删除了该行的末尾,仅保留文件名。
第4行和第5行计算每个唯一行。
第6行按相反的顺序按行计数排序。


诸如doxygen之类的工具(与graphviz选项一起使用)可以为包含文件生成依赖关系图...我不知道它们是否可以为您要执行的操作提供足够的概述,但值得尝试。


该页面中的Bash脚本不是很好的解决方案。它仅适用于简单项目。实际上,在大型项目中,例如在标题页中进行描述,经常使用C预处理器(#if,#else,...)。只有更复杂的优质软件(例如makedepend或scons)才能提供优质信息。 gcc -E可以提供帮助,但是在大型项目中,其结果分析是浪费时间。


使用ccache。它将输入的内容散列到编译中,并缓存结果,这将大大提高此类编译的速度。

如果要检测多个包含,以便删除它们,则可以按照Iulian?erb?noiu的建议使用makedepend:

1
makedepend -m *.c  -f - > /dev/null

将对每个包含多个内容发出警告。


如果您想知道其中最包含哪些文件,请使用以下bash命令:

find . -name '.cpp' -exec egrep '^[:space:]#include[[:space:]]+["<][[:alpha:][:digit:]_.]+[">]' {} \\;

| sort | uniq -c | sort -k 1rn,1
| head -20

它将显示排名前20位的文件,按其包含的时间排序。

说明:第一行查找所有* .cpp文件,并从中提取带有" #include"指令的行。第二行计算每个文件包含多少次,第三行计算20个包含最多的文件。


这并不完全是您要搜索的内容,它可能不容易设置,但是可能您可以看看lxr:lxr.linux.no是可浏览的内核树。

在搜索框中,如果输入文件名,则会在其中包含文件名。
但这仍然是猜测,并且它不跟踪链接的依赖项。

也许

1
2
strace -e trace=open -o outfile make
grep 'some handy regex to match header'

您可能希望查看分布式编译,例如,参见distcc


IIRC gcc可以创建依赖文件。


推荐阅读