是否可以为C++文件生成依赖项列表

Is it possible to generate list of dependencies for a C++ file?

本文关键字:依赖 列表 文件 C++ 是否      更新时间:2023-10-16

我想为特定文件创建一个依赖项列表。例如:

//a.cpp
#include "b.h"
#include <cstdio>
int main(){printf("%dn",fn());}
//b.h
int fn();
//b.cpp
#include "b.h"
#include "c.h"
int fn(){return fn2();}
//c.h
inf fn2();
//c.cpp
#include "c.h"
int fn2(){return 5;}

对于这些文件,a 依赖于 b,而 b 依赖于 c。所以想要的程序的结果应该是:

a: a.o b.o c.o

是的,它适用于生成文件。出于某些原因,我不希望列表包含目录中的所有.o文件,因此%.o不起作用。另外,我知道g++ -MMD选项,它几乎可以按照我的意愿工作 - 但它只列出了直接依赖项,在这种情况下:

a.o: a.cpp b.h

(扩展不是问题,我可以稍后对其进行后处理)

有没有一种简单的方法来生成这样的列表?

看来你还在继续这个...首先要了解的是,对象文件依赖于其他对象文件。依赖项列出了构建某些内容所需的文件。要创建目标文件,您需要一些源文件及其使用的标头。这正是-MD标志的变化为您提供的信息。

如果要确定构建可执行文件需要哪些对象文件,则需要一些不同的东西:您需要在对象文件之间创建依赖关系图,然后从具有入口点的节点(即main()函数)开始创建图形搜索。执行此操作的工具nm打印对象的符号信息,对象文件和类似tsort的东西,但是,它仅提供拓扑顺序而不是连接的组件。但是,您可以使用tsort用于完成其工作的相同信息。

nm程序只是转储对象文件中定义或引用的所有符号。您将使用所有带有大写字符的符号来指示对象文件(即节点)提供此符号(如果它与'U'不同)或需要该符号(即字符'U')。符号的确切含义(例如,'T'"文本",即程序代码)并不重要,除了'U'表示"未定义"并且其他一切都是定义(好吧,'W'可能会进行一些斗争,因为这些是"弱"符号,多个翻译单元可能有它们)。如果一个节点未定义符号,而另一个节点定义了符号,则连接两个节点。

构建图形后,您将使用定义'main()'的节点作为开始节点并搜索可访问的图形。到达的所有目标文件(节点)都需要构建相应的程序。这就是算法描述。实际实现可能有所不同,实际上更简单:

  1. 使用 tsort 将目标文件按正确的依赖关系顺序排列。如果有周期,请将其删除。
  2. 从包含main()的对象文件开始,并将其记录为依赖项。
  3. 记录所有已定义和未定义的符号。
  4. 删除存在已定义符号的每个未定义符号。
  5. 如果没有未定义的符号:完成。
  6. 打开下一个对象文件。如果没有更多,则为错误(您有一个循环,您需要重新处理涉及循环的双向连接组件上的所有对象文件)。
  7. 查看是否存在任何未定义符号的已定义符号。如果没有,请转到 6。
  8. 将对象文件记录为依赖项。
  9. 转到 3.

除了链接器之外,我不知道有任何工具可以做到这一点。原因是更改任何对象文件都可以更改依赖项,并且您需要重新评估每个程序的依赖项。顺便说一下,这就是链接器的作用。

如果您陈述您的实际目标是什么,而不是询问设想的解决方案的各个方面,也许您会得到更好的帮助。