生成文件不对文件使用隐式规则

Makefile doesn't use implicit rule on file

本文关键字:文件 规则      更新时间:2023-10-16

我只是想为一个小型C++项目编写一个快速的Makefile,但当我尝试构建时,make说:

没有使目标成为目标的规则"obj/main.o";

即使我的隐式规则应该涵盖该文件。我见过其他人忘记了斜杠或其他什么,但我不认为这个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 $@

我在我的树莓派3 b.上使用树莓派操作系统

因为

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.hpp

您只能编译同时具有一个cpp和一个hpp的文件,但您的main没有头(例如,您有一个src/main.cpprc/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其他头文件(通常是这种情况(时,向头添加依赖项是不足以在必要时重新编译的。

您可以查看makedependent,将其安装在raspbian/debian/ubuntu:apt-get install xutils-dev


请注意,每次进行制作:时都会完成链接

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 $