依存関係リゾルバーを使用して、単純なC++インクリメンタルビルドツールを作成しようとしています。私はcppビルドプロセスに関する1つの問題について混乱しています。ライブラリがいくつかのファイルで構成されていると想像してください。
// 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。したがって、2つのobjファイルとリンクする必要があります。
g++ -o app1 app1.o s1.o s2.o
対照的に、h3.hが含まれている場合
// app2.cpp
#include "h3.h"
int main()
{
H3();
return 0;
}
ソースの依存関係は1つだけです:our_src-> h3-> s2
したがって、h3.hをインクルードする場合、コンパイルする必要があるのはs2.cppのみです(s1.cpp-> h2.hをインクルードしているにもかかわらず)。
g++ -o app2 app2.o s2.o
これは問題の非常に単純な例です。実際のプロジェクトでは、確かに数百のファイルがあり、非効率的なインクルードのチェーンにはさらに多くのファイルが含まれている可能性があります。
だから私の質問は:依存関係をチェックするときに(CPP解析なしで)どのヘッダーインクルージョンを省略できるかを見つける方法や手段はありますか?
ご回答いただければ幸いです。