【发布时间】:2011-11-24 17:15:29
【问题描述】:
我正在尝试使用依赖解析器创建简单的 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 解析)时,是否有方法或工具可以找出可以省略哪些标头包含?
如果有任何回应,我将不胜感激。
【问题讨论】:
标签: c++ compiler-construction build incremental-build