Makefile не использует неявное правило для файла - PullRequest
1 голос
/ 11 июля 2020

Я просто хотел быстро написать Makefile для небольшого проекта на C ++, но когда я пытаюсь собрать, make говорит:

Нет правила для создания цели «obj / main.o»

хотя мое неявное правило должно охватывать этот файл. Я видел других, кто забыл sla sh или что-то в этом роде, но я не вижу проблемы с этим Makefile:

.PHONY: run, clean

SRCDIR:=./src
OBJDIR:=./obj
BINDIR:=./bin

CC:=gcc
CXX:=g++

SRC:=$(shell find -name *.cpp)
HXX:=$(shell find -name *.hpp)
OBJ:=$(subst src/,obj/,$(SRC:%.cpp=%.o))
EXE:=main

CXXFLAGS:=-std=c++14 -Wall

$(EXE): $(OBJ)
    @echo $(OBJ)
    $(CXX) $(CXXFLAGS) $^ -o $(BINDIR)/$@

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.hpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

Я использую Raspberry Pi OS на своем Raspberry Pi 3 b.

1 Ответ

2 голосов
/ 11 июля 2020

из-за

$(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 $ 
...