我只是想为一个小型C++项目编写一个快速的Makefile,但是当我尝试构建时,make会说:
No rule to make target "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 $@
我在Raspberry Pi 3 b上使用Raspberry Pi OS。
最佳答案
因为
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.hpp
您只能编译同时具有cpp和hpp的文件,但您的main文件没有 header (例如,您有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 $
(Aucunerègle倒入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
请注意,每次创建链接时都会完成该链接:
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 $
关于c++ - Makefile不对文件使用隐式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62849269/