如何在Linux上找到大型项目的标头依赖项

时间:2020-03-05 18:58:14  来源:igfitidea点击:

我正在做一个非常大规模的项目,其中的编译时间很长。我可以在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可以提供帮助,但是在大型项目中,其结果分析是浪费时间。