gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:50:08 25 4
gpt4 key购买 nike

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

//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,而 b 又依赖于 c。所以想要的程序的结果应该是:

a: a.o b.o c.o

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

a.o: a.cpp b.h

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

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

最佳答案

看来你还在继续 this ... 首先要了解的是目标文件依赖其他目标文件。依赖项列出了构建某些东西所必需的文件。要创建目标文件,您需要一些源文件及其使用的 header 。这正是-MD 标志的变体为您提供的信息。

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

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

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

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

除了链接器,我不知道有任何工具可以执行此操作。原因是更改任何目标文件都会更改依赖关系,您需要重新评估每个程序的依赖关系。顺便说一句,这就是链接器的作用。

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

关于c++ - 是否可以为 C++ 文件生成依赖项列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27974961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com