是否可以为C++文件生成依赖项列表
Is it possible to generate list of dependencies for a C++ file?
我想为特定文件创建一个依赖项列表。例如:
//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()'
的节点作为开始节点并搜索可访问的图形。到达的所有目标文件(节点)都需要构建相应的程序。这就是算法描述。实际实现可能有所不同,实际上更简单:
- 使用
tsort
将目标文件按正确的依赖关系顺序排列。如果有周期,请将其删除。 - 从包含
main()
的对象文件开始,并将其记录为依赖项。 - 记录所有已定义和未定义的符号。
- 删除存在已定义符号的每个未定义符号。
- 如果没有未定义的符号:完成。
- 打开下一个对象文件。如果没有更多,则为错误(您有一个循环,您需要重新处理涉及循环的双向连接组件上的所有对象文件)。
- 查看是否存在任何未定义符号的已定义符号。如果没有,请转到 6。
- 将对象文件记录为依赖项。
- 转到 3.
除了链接器之外,我不知道有任何工具可以做到这一点。原因是更改任何对象文件都可以更改依赖项,并且您需要重新评估每个程序的依赖项。顺便说一下,这就是链接器的作用。
如果您陈述您的实际目标是什么,而不是询问设想的解决方案的各个方面,也许您会得到更好的帮助。
- 如何从C++中的依赖类型中获得它所依赖的类型
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 类成员函数参数列表是否可以依赖于模板参数?
- 正确的生成文件依赖项列表 (C++)
- 如何找出依赖于LIB文件的DLL列表?
- 当删除部分依赖列表时,GNU make 对每个对象文件使用相同的源文件
- 构造函数初始化列表中的循环依赖项
- C++:使用RAII解析构造函数-初始化器列表依赖项
- 是否可以为C++文件生成依赖项列表
- 获取Qt应用程序的.so依赖项的完整列表
- 依赖于mac的sdk的Qt应用程序在otool列表中有@executable_path..我该怎么改
- 如何获取.so文件的依赖项列表
- 在c++中,当组合对象构造函数有依赖关系时,如何在初始化列表中强制它们的顺序
- C++std列表排序使用自定义比较器,该比较器依赖于对象实例的成员变量
- 向GNU依赖项列表中添加文件
- 依赖初始化列表
- 为什么标准不允许在模板形参列表中初始化依赖于常量的类型
- 是一个长列表的依赖关系,因为调用RegOpenKeyEx正常
- 初始化列表中的依赖项