提问者:小点点

Makefile未对文件使用隐式规则


我只是想为一个小型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 $@

我正在使用覆盆子皮OS在我的覆盆子皮3 B。


共1个答案

匿名用户

因为

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

您只能编译同时具有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 $ 

在源代码#包含其他头文件时,向头添加依赖项不足以在必要时重新编译,这种情况经常发生。

您可以查看makedepend,在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 $