c++ - Makefile不对文件使用隐式规则

标签 c++ makefile c++14

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

相关文章:

c++ - 不确定如何使用 header , "...was not declared in this scope"错误

c++ - 除了 what() 之外,C++ 异常是否应该提供额外的细节?

makefile - 发现 Makefile 或 cmake 的 MPI api 版本

c++ - 如何在 C++ 中为多个类创建别名

c++ - C++ std::string 的 NRVO

c++ - 正确的方法返回STL容器

c++ - 以编程方式计算 Windows 上进程的开始时间

linux - 目录作为 make 规则中的依赖项

python - 使用 CFFI 构建 Python-C 扩展,但 Setuptools 不在构建中包含自定义头文件

c++ - unique_ptr 链表插入 - 与 operator= 不匹配