关于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可以创建依赖文件。


推荐阅读

    linux命令补全工具?

    linux命令补全工具?,工具,系统,软件,地址,命令,名称,智能,环境,信息,终端,简

    linux编译完运行命令?

    linux编译完运行命令?,系统,代码,环境,工具,信息,命令,文件,程序,终端,编辑,

    linux中查找替换命令?

    linux中查找替换命令?,标的,文件,名称,代码,内容,字符串,命令,批量,方法,表

    递归查找linux命令?

    递归查找linux命令?,时间,档案,命令,标准,数据,系统,名称,文件,服务,信息,lin

    linux系统命令行工具?

    linux系统命令行工具?,工具,系统,工作,状态,命令,地方,标准,信息,环境,基础,L

    linux查找设备号命令?

    linux查找设备号命令?,设备,系统,信息,名称,分区,网上,情况,软件,技术,工具,

    linux打包项目命令?

    linux打包项目命令?,项目,文件,命令,软件,数字,系统,名称,工具,目录,格式,Lin

    linux项目更新命令行?

    linux项目更新命令行?,工作,地址,系统,数据,信息,项目,标准,电脑,目录,命令,l

    linux中编译命令是?

    linux中编译命令是?,系统,代码,工具,基础,名字,命令,编译器,文件,终端,源程

    linux源码编译命令?

    linux源码编译命令?,代码,设备,环境,工作,官网,最新,下来,电脑,软件,项目,如

    linux命令下载工具?

    linux命令下载工具?,工具,网络,代理,代码,简介,位置,系统,第一,下载工具,文

    linux终端编译命令?

    linux终端编译命令?,代码,工具,环境,系统,终端,文件,源程序,编译器,语言,指

    linux查找网卡的命令?

    linux查找网卡的命令?,地址,系统,网络,实时,工具,信息,技术指标,电脑,状态,

    linux好用的命令工具?

    linux好用的命令工具?,系统,管理,工具,基础,服务,信息,工作,发行,公司,代码,L

    字符串查找命令linux?

    字符串查找命令linux?,系统,字符串,工具,信息,文件,命令,字符,选项,文本,范

    linux常用命令行工具?

    linux常用命令行工具?,系统,工作,工具,地址,管理,信息,命令,软件,目录,基础,l

    linux命令行专业工具?

    linux命令行专业工具?,工具,系统,工作,信息,服务,环境,基础,命令,管理,发行,l

    linux查找帮助的命令?

    linux查找帮助的命令?,系统,命令,信息,软件,名称,文件,指令,进程,表示,参数,l

    linux查找帮助的命令?

    linux查找帮助的命令?,系统,命令,信息,软件,名称,文件,指令,进程,表示,参数,l

    linux命令行执行工具?

    linux命令行执行工具?,工具,系统,网络,分析,工作,服务,状态,信息,电脑,发行,s