Во-первых, обратите внимание, что при попытке создать test
используются только файлы test.cc
и common.h
.Код в test.cc
вызывает функцию foo()
, но эта функция не определена ни в одном из этих файлов;это определено в common.cc
, который не был приглашен.И если вы попытаетесь исправить это, добавив common.cc
или common.o
к рецепту, у вас возникнут дополнительные проблемы, потому что common.cc
содержит определение main()
, как и test.cc
, и можетбыть только одним.
Если вы хотите использовать foo()
с другими версиями main()
, вам не следует помещать main()
в common.cc
.
Теперь для рецепта make-файла:
test: test.cc $(DEPS)
g++ $(FLAGS) $^ -g -o $@
Это расширяется до:
test: test.cc common.h
g++ -lpthread test.cc common.h -g -o test
Что неверно, как указал @NeilButterworth.Вы можете сделать это:
test: test.cc common.cc
g++ test.cc common.cc -lpthread -g -o test
, который может быть записан как:
test: test.cc common.cc
g++ $^ $(FLAGS) -g -o $@
Но это может не сработать при изменении common.h
, и когда оно действительно восстанавливается, оно может перекомпилироватьсяисточник, который не изменился .Лучший подход:
common.o: common.cc $(DEPS)
g++ -c $< -g -o $@
test.o: test.cc $(DEPS)
g++ -c $< -g -o $@
common: common.o
g++ $^ $(FLAGS) -o $@
test: test.o common.o
g++ $^ $(FLAGS) -o $@
И дальнейшее улучшение возможно, как только у вас будет много работы.