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

时间:2015-01-15 23:33:22

标签: c++

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

//a.cpp
#include "b.h"
#include <cstdio>
int main(){printf("%d\n",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 ,它取决于 c 。所以想要的程序的结果应该是:

a: a.o b.o c.o

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

a.o: a.cpp b.h

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

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

1 个答案:

答案 0 :(得分:4)

您似乎还在继续this ...首先要了解的是,对象文件 依赖在其他对象文件上。依赖项列出了构建内容所需的文件。要创建目标文件,您需要一些源文件和它正在使用的标头。这完全 -MD标志的变体给你的信息。

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

nm程序只会转储目标文件中定义或引用的所有符号。您使用具有大写字符的所有符号来指示目标文件(即节点)提供此符号(如果它不同于'U')或需要该符号(即字符)是'U')。符号的确切含义(例如,'T'用于&#34;文本&#34;,即程序代码)除了'U'含义&#34; undefined&#34之外没有其他意义;而其他一切都是一个定义(好吧,'W'可能会有点斗争,因为这些是&#34;弱&#34;符号和多个翻译单元可能有它们)。如果一个节点的符号未定义而另一个节点已定义符号,则您将连接两个节点。

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

  1. 使用tsort将目标文件置于适当的依赖顺序中。如果有周期,请将其删除。
  2. 从包含main()的目标文件开始,并将其记录为依赖项。
  3. 记录所有已定义和未定义的符号。
  4. 删除已定义符号的每个未定义符号。
  5. 如果没有未定义的符号:完成。
  6. 打开下一个目标文件。如果没有它是一个错误(你有一个循环,你需要重新处理涉及循环的双连通组件上的所有对象文件。
  7. 查看是否存在未定义符号的已定义符号。如果没有,请转到6。
  8. 将对象文件记录为依赖项。
  9. 转到3。
  10. 除了链接器之外,我还没有发现任何工具。原因是更改任何目标文件可以更改依赖项,您需要重新评估每个程序的依赖项。顺便说一下,这就是链接器所做的事情。

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

相关问题