Как отметил в комментарии Нил Баттерворт, заключайте сделки с файлами. Скажем, у вас есть foo.cpp
и bar.h
. Последний содержит ваш шаблон. И первое может сделать, например:
#include "bar.h"
class Foo : public Bar<Widget> { [...] };
Хотя ваш Foo
класс наследуется и, следовательно, зависит от вашего Bar
шаблонного класса, вы также уже объявляете свои файловые зависимости с помощью #include
s.
Это те же зависимости файлов, которые вы указываете в вашем Makefile:
foo.o: foo.cpp bar.h
g++ -I. -o foo.o foo.cpp
Для этого правила make ожидает, что указанные вами команды создают foo.o
на основе файлов foo.cpp
и bar.h
. Если вы уже собрали foo.o
один раз, и эти зависимости не изменились, make знает, что он может вообще пропустить правило.
Может показаться утомительным указывать файловые зависимости дважды, но, к счастью, зависимости в вашем Makefile могут автоматически генерироваться из #include
s в вашем исходном коде GCC с использованием параметра командной строки -M
. Вы можете прочитать об этом на справочной странице gcc(1)
. Просто возьмите вывод GCC, сохраните его где-нибудь, обычно foo.d
и include
в вашем Makefile.
С помощью некоторых волшебников вы можете автоматизировать генерацию *.d
файлов зависимостей в том же Makefile, который создает ваше приложение.