我想为特定文件创建依赖项列表。例如:
//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
(扩展不是问题,我可以稍后对其进行后处理)
有没有简单的方法来生成这样的列表?
答案 0 :(得分:4)
您似乎还在继续this ...首先要了解的是,对象文件 依赖在其他对象文件上。依赖项列出了构建内容所需的文件。要创建目标文件,您需要一些源文件和它正在使用的标头。这完全 -MD
标志的变体给你的信息。
如果要确定构建可执行文件所需的对象文件,则需要不同的东西:需要在目标文件之间创建依赖关系图,然后从具有入口点的节点开始创建图搜索(即, main()
函数)。执行此操作的工具是nm
,它将对象的符号信息打印为目标文件,类似tsort
,但是,它只提供拓扑顺序而不是连接组件。但是,您可以使用tsort
用于执行其工作的相同信息。
nm
程序只会转储目标文件中定义或引用的所有符号。您使用具有大写字符的所有符号来指示目标文件(即节点)提供此符号(如果它不同于'U'
)或需要该符号(即字符)是'U'
)。符号的确切含义(例如,'T'
用于&#34;文本&#34;,即程序代码)除了'U'
含义&#34; undefined&#34之外没有其他意义;而其他一切都是一个定义(好吧,'W'
可能会有点斗争,因为这些是&#34;弱&#34;符号和多个翻译单元可能有它们)。如果一个节点的符号未定义而另一个节点已定义符号,则您将连接两个节点。
构建图表后,您将使用定义'main()'
的节点作为起始节点并搜索可访问的图表。到达所有目标文件(节点)是构建相应程序所必需的。这就是算法描述。实际的实现可能会有所不同,实际上更简单:
tsort
将目标文件置于适当的依赖顺序中。如果有周期,请将其删除。main()
的目标文件开始,并将其记录为依赖项。除了链接器之外,我还没有发现任何工具。原因是更改任何目标文件可以更改依赖项,您需要重新评估每个程序的依赖项。顺便说一下,这就是链接器所做的事情。
如果你陈述了你的实际目标,而不是询问预想的解决方案的各个方面,也许你会得到更好的帮助。