如何在Linux上找到大型项目的标头依赖项
我正在做一个非常大规模的项目,其中的编译时间很长。我可以在Linux上使用哪些工具(最好是开放源代码)来查找包含最多的文件并优化其使用率?
为了更清楚一点,我需要一个工具,该工具会在给定依赖性的情况下,向我显示最包含哪些标头。顺便说一下,我们确实使用了分布式编译
解决方案
回答
IIRC gcc可以创建依赖文件。
回答
我们可能想看一下分布式编译,例如distcc
回答
签出makdepend
回答
诸如doxygen之类的工具(与graphviz选项一起使用)可以为包含文件生成依赖关系图...我不知道它们是否会为我们要执行的操作提供足够的概述,但是值得尝试。
回答
这并不完全是我们要搜索的内容,并且设置起来可能并不容易,但是也许我们可以看看lxr:lxr.linux.no是可浏览的内核树。
在搜索框中,如果输入文件名,它将为我们提供文件名所在的位置。
但这仍然是猜测,并且它不跟踪链接的依赖项。
可能是
strace -e trace=open -o outfile make grep 'some handy regex to match header'
回答
如果我们想知道其中最包含哪些文件,请使用以下bash命令:
find . -name '.cpp' -exec egrep '^[:space:]#include[[:space:]]+["<][[:alpha:][:digit:]_.]+[">]' {} \; | sort | uniq -c | sort -k 1rn,1 | head -20
它将显示前20个文件,按包含时间排序。
说明:第一行找到所有* .cpp文件,并从其中提取带有" #include"指令的行。第二行计算每个文件包含多少次,第三行计算20个包含最多的文件。
回答
我建议使用Unix哲学"将许多小工具粘合在一起",建议编写一个简短的脚本,该脚本使用-M(或者-MM)和-MF(OUTFILE)选项调用gcc(如此处所述)。这将生成make工具的依赖项列表,我们可以轻松地对其进行解析(相对于直接解析源文件)并提取所需的信息。
回答
此处的答案将为我们提供跟踪#include依赖关系的工具。但是没有提到优化之类的东西。
另外:《大型C ++软件设计》一书应该会有所帮助。
回答
从源树的根目录执行以下操作(\ t是制表符):
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行按相反的顺序按行数排序。
回答
使用ccache。它将输入的内容散列到编译中,并缓存结果,这将大大提高此类编译的速度。
如果要检测多个包含,以便将其删除,则可以按照Iulian?erb?noiu的建议使用makedepend:
makedepend -m *.c -f - > /dev/null
将对每个包含多个对象发出警告。
回答
在页面中找到的Bash脚本不是很好的解决方案。它仅适用于简单项目。实际上,在大型项目中,例如在标题页中进行描述,经常使用C预处理器(#if,#else,...)。只有更复杂的优质软件(例如makedepend或者scons)才能提供优质信息。 gcc -E可以提供帮助,但是在大型项目中,其结果分析是浪费时间。