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

C++ 是否可以为C+;生成依赖项列表+;文件,c++,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.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;}
是的,它是用来制作文件的。由于某些原因,我不希望该列表包含目录中的所有
.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
  • 除了链接器之外,我不知道有任何工具会这样做。原因是更改任何对象文件都会更改依赖项,您需要重新评估每个程序的依赖项。顺便说一句,链接器就是这样做的


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

    您似乎仍在继续……首先要了解的是,对象文件不依赖于其他对象文件。依赖项列出了构建某个对象所需的文件g、 要创建对象文件,您需要一些源文件及其使用的标题。这正是
    -MD
    标志的变体提供给您的信息

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

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

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

  • 使用
    tsort
    将对象文件按适当的依赖顺序排列。如果存在循环,请删除它们
  • 从包含a.o: a.cpp b.h