Я пытаюсь создать простой инструмент инкрементной сборки 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)?
Буду признателен за любой ответ.