из-за
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.hpp
вы можете скомпилировать только файл, имеющий и a cpp и hpp , но у вашего main нет заголовка (например, у вас есть src / main. cpp, но нет src / main.hpp )
Пример:
pi@raspberrypi:/tmp/p $ find .
.
./bin
./src
./src/main.cpp
./Makefile
./obj
pi@raspberrypi:/tmp/p $ make
make: *** Aucune règle pour fabriquer la cible « obj/main.o », nécessaire pour « main ». Arrêt.
pi@raspberrypi:/tmp/p $ touch src/main.hpp
pi@raspberrypi:/tmp/p $ make
g++ -std=c++14 -Wall -c src/main.cpp -o obj/main.o
./obj/main.o
g++ -std=c++14 -Wall obj/main.o -o ./bin/main
pi@raspberrypi:/tmp/p $
( Aucune règle pour fabriquer la cible ... означает Нет правила для создания цели )
Заменив строку на
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
компиляция сделана:
pi@raspberrypi:/tmp/p $ find .
.generally
./bin
./src
./src/main.cpp
./Makefile
./obj
pi@raspberrypi:/tmp/p $ make
g++ -std=c++14 -Wall -c src/main.cpp -o obj/main.o
./obj/main.o
g++ -std=c++14 -Wall obj/main.o -o ./bin/main
pi@raspberrypi:/tmp/p $
Для добавления зависимости в заголовок недостаточно перекомпилировать при необходимости при исходнике #include
другие файлы заголовков, что часто бывает.
Вы можете посмотреть makedepend , чтобы установить его в raspbian / debian / ubuntu: apt-get install xutils-dev
Обратите внимание, что ссылка создается каждый раз, когда вы делаете make :
pi@raspberrypi:/tmp/p $ find .
.
./bin
./bin/main
./src
./src/main.hpp
./src/main.cpp
./Makefile
./obj
./obj/main.o
pi@raspberrypi:/tmp/p $ make
./obj/main.o
g++ -std=c++14 -Wall obj/main.o -o ./bin/main
pi@raspberrypi:/tmp/p $ make
./obj/main.o
g++ -std=c++14 -Wall obj/main.o -o ./bin/main
pi@raspberrypi:/tmp/p $