【问题标题】:How to find header dependencies for large scale projects on linux [closed]如何在 linux 上查找大型项目的头文件依赖项 [关闭]
【发布时间】:2008-09-17 07:51:31
【问题描述】:

我正在处理一个非常大规模的项目,其中编译时间非常长。我可以在 Linux 上使用哪些工具(最好是开源工具)来查找包含最多的文件并优化它们的使用? 为了更清楚起见,我需要一个工具,它会根据依赖关系向我显示哪些标题包含最多。顺便说一下,我们确实使用分布式编译

【问题讨论】:

  • 为了更清楚,我需要一个工具,它会根据依赖关系向我显示哪些标题包含最多。顺便说一句,我们确实使用分布式编译
  • 也许您应该编辑您的问题以包含此信息,而不是将其作为评论?

标签: c++


【解决方案1】:

查看makdepend

【讨论】:

  • 这给了我每个文件的依赖关系。鉴于此,我需要一些东西,它会找到包含最多的文件。
【解决方案2】:

here 的答案将为您提供跟踪#include 依赖项的工具。但是没有提到优化之类的。

旁白:“大规模 C++ 软件设计”一书应该会有所帮助。

【讨论】:

    【解决方案3】:

    使用“将许多小工具粘合在一起”的 Unix 哲学,我建议编写一个简短的脚本,使用 -M(或 -MM)和 -MF(OUTFILE)选项调用 gcc(详见here)。这将为 make 工具生成依赖列表,然后您可以轻松解析(相对于直接解析源文件)并提取所需的信息。

    【讨论】:

    • 天啊!几十年来,我在哪里进行黑客攻击?来自权威来源。这些选项的少量质量时间(如 Daemin 的可靠回复中详述)和一些常规但相关的黑客,就是这样。谢谢大民。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      从源代码树的根级别执行以下操作(\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 行按行数倒序排序。

      【讨论】:

      • 你需要 [^">]* 而不是 grep 中的 [^">]。
      • 这也不跟踪下游生成的包含。对于更复杂的项目,解析“gcc -E -dI”的输出会好很多。
      【解决方案6】:

      使用ccache。它将对编译的输入进行哈希处理,并缓存结果,这将大大提高此类编译的速度。

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

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

      将为每个多重包含发出警告。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          如果您想知道最重要的是包含哪些文件,请使用以下 bash 命令:

          找到 . -name '.cpp' -exec egrep '^[:space:]#include[[:space:]]+["]' {} \;

          |排序 |唯一的-c |排序 -k 1rn,1
          |头 -20

          它将显示按包含次数排列的前 20 个文件。

          说明:第一行查找所有 *.cpp 文件并从中提取带有“#include”指令的行。第 2 行计算每个文件被包含的次数,第 3 行取 20 个主要包含的文件。

          【讨论】:

          • 尚未对此进行检查,但如果使用两个不同的路径包含同一个文件,您的解决方案将不起作用。 IE。 #include 和 #include <.> 将被视为不同的包含文件。
          • 不过基本上是个好主意。
          【解决方案9】:

          IIRC gcc 可以创建依赖文件。

          【讨论】:

            【解决方案10】:

            您可能想查看分布式编译,例如 distcc

            【讨论】:

              【解决方案11】:

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

              在搜索框中,如果您输入文件名,它会告诉您它的包含位置。 但这仍然是猜测,它不跟踪链式依赖关系。

              也许

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

              【讨论】:

                猜你喜欢
                • 2010-09-16
                • 1970-01-01
                • 2010-09-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-09-03
                • 2011-06-16
                • 1970-01-01
                相关资源
                最近更新 更多