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()
的对象文件开始,并将其记录为依赖项如果您陈述了您的实际目标,而不是询问设想解决方案的各个方面,您可能会得到更好的帮助。您似乎仍在继续……首先要了解的是,对象文件不依赖于其他对象文件。依赖项列出了构建某个对象所需的文件g、 要创建对象文件,您需要一些源文件及其使用的标题。这正是
-MD
标志的变体提供给您的信息
如果要确定构建可执行文件需要哪些对象文件,则需要做一些不同的事情:需要在对象文件之间创建依赖关系图,然后从具有入口点的节点(即main()
函数)开始创建图搜索。执行此操作的工具有nm
,它将对象的符号信息打印到对象文件中,以及类似tsort
的工具,但是,它只提供拓扑顺序,而不是连接的组件。但是,您可以使用tsort
用于执行其工作的相同信息
nm
程序只是转储对象文件中定义或引用的所有符号。您可以使用所有符号,并使用大写字符来表示对象文件(即节点)提供此符号(如果它与'U'
不同)或需要该符号(即字符为'U'
).符号的确切含义(例如,'T'
表示“文本”,即程序代码)并不重要,除了'U'
表示“未定义”和其他定义之外(嗯,'W'
可能会引起一些争论,因为这些符号是“弱”符号,多个翻译单元可能有它们)。如果一个节点的符号未定义,而另一个节点的符号已定义,则将连接两个节点
构建图形后,您将使用定义'main()'
的节点作为开始节点,并搜索可访问的图形。构建相应的程序需要访问的所有对象文件(节点)。这是算法描述。实际实现可能不同,实际上更简单:
tsort
将对象文件按适当的依赖顺序排列。如果存在循环,请删除它们a.o: a.cpp b.h