我正在开展一个非常大规模的项目,编译时间非常很长。我可以在Linux上使用哪些工具(最好是开源)来查找包含最多的文件并优化其用途? 为了更清楚,我需要一个工具,根据依赖关系,我会告诉我哪些标题最多。顺便说一句,我们使用分布式编译
答案 0 :(得分:4)
答案 1 :(得分:4)
答案here将为您提供跟踪#include依赖关系的工具。但是没有提到优化等等。
除此之外:“大规模C ++软件设计”一书应该有所帮助。
答案 2 :(得分:2)
像doxygen这样的工具(与graphviz选项一起使用)可以为包含文件生成依赖图...我不知道他们是否提供了足够的概述来解决你想要做的事情,但它可能值得一试。
答案 3 :(得分:2)
使用“将许多小工具粘合在一起”的Unix哲学我建议编写一个使用-M(或-MM)和-MF(OUTFILE)选项调用gcc的简短脚本(如详细here )。这将生成make工具的依赖项列表,然后您可以轻松解析(相对于直接解析源文件)并提取所需的信息。
答案 4 :(得分:2)
从源树的根级别执行以下操作(\ 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行按相反顺序按行计数。
答案 5 :(得分:1)
如果您想知道最重要的文件,请使用此bash命令:
找到。 -name' .cpp'-exec egrep'^ [:space:] #include [[:space:]] + [“&lt;] [[:alpha:] [:digit:] _ 。] + [“&gt;]'{} \;|排序| uniq -c | sort -k 1rn,1
|头-20 -
它将显示排名前20位的文件。
说明:第1行找到所有* .cpp文件并从中提取带有“#include”指令的行。第二行计算每个文件的包含次数,第三行包含20个主要包含的文件。
答案 6 :(得分:1)
使用ccache。它会将输入哈希到编译中,并缓存结果,这将大大提高这些编译的速度。
如果你想检测多个包含,以便你可以删除它们,你可以使用makedepend作为IulianŞerbănoiu建议:
makedepend -m *.c -f - > /dev/null
会为每个包含的内容发出警告。
答案 7 :(得分:1)
页面中找到的Bash脚本不是很好的解决方案。它仅适用于简单的项目。事实上,在大型项目中,如在标题页中描述,经常使用C预处理器(#if,#else,...)。只有更复杂的好软件,如makedepend或scons才能提供良好的信息。 gcc -E可以提供帮助,但是,对于大型项目,其结果分析是浪费时间。
答案 8 :(得分:0)
IIRC gcc可以创建依赖文件。
答案 9 :(得分:0)
您可能希望查看分布式编译,例如参见distcc
答案 10 :(得分:0)
这不是你想要的,它可能不容易设置,但可能你可以看看lxr:lxr.linux.no是一个可浏览的内核树。
在搜索框中,如果输入文件名,它将为您提供包含文件名的位置。 但这仍然在猜测,并且它不会跟踪链式依赖关系。
也许
strace -e trace=open -o outfile make
grep 'some handy regex to match header'