我正在尝试使用依赖解析器创建简单的 C++ 增量构建工具。我一直对 cpp 构建过程的一个问题感到困惑。想象一下,我们有一个包含几个文件的库:
// h1.h
void H1();
// s1.cpp
#include "h1.h"
#include "h2.h"
void H1(){ H2(); }
// h2.h
void H2();
// s2.cpp
#include "h2.h"
#include "h3.h"
void H2(){ /*some implementation*/ }
void H3(){ /*some implementation*/ }
// h3.h
void H3();
在包含 h1.h 的客户端代码中时
// app1.cpp
#include "h1.h"
int main()
{
H1();
return 0;
}
s2.cpp 实现存在隐式依赖关系:our_src -> h3 -> s1 -> h2 -> s2。所以我们需要链接两个obj文件:
g++ -o app1 app1.o s1.o s2.o
相比之下,当 h3.h 包含
// app2.cpp
#include "h3.h"
int main()
{
H3();
return 0;
}
只有一个源依赖:our_src -> h3 -> s2
因此,当我们包含 h3.h 时,我们只需要编译 s2.cpp(尽管包含 s1.cpp -> h2.h):
g++ -o app2 app2.o s2.o
这是一个非常简单的问题示例,在实际项目中,我们肯定有数百个文件,而低效的包含链可能包含更多文件。
所以我的问题是:当我们检查依赖项(没有 CPP 解析)时,有没有办法或工具来找出可以省略哪些标头包含?
我会很感激任何回应。