c++ - linux C++ gmake "No rule to make target"

标签 c++ linux gnu-make makefile

我已经有几十年没有管理 makefile 了。我在这里检查了现有的答案,并在其他地方进行了谷歌搜索。当我使用目标时: $(BIN)/$(EXECUTABLE): $(OBJECTS) 我很困惑为什么我的 makefile 失败了:

$ make make: *** 没有规则可以创建“bin/main”所需的目标“src/SRecord.o”。停止。

这是 Makefile:

# execute `make D='-g'` to make with debug symbols
DEFS := $(D)
CC := gcc $(DEFS)
CFLAGS := -std=c99 -Wall -Wextra
CXX := g++ $(DEFS)
CXXFLAGS := -std=c++17 -Wall -Wextra

BIN := bin
SRC := src
INCLUDE := include
LIB := lib

#LIBSOURCES := $(wildcard $(LIB)/*.cpp)
#LIBOBJECTS := $(LIBSOURCES:%.cpp=%.o)
#OBJECTS := $(subst $(LIB)/,,$(LIBOBJECTS))

SOURCES := $(wildcard $(SRC)/*.cpp)
OBJECTS := $(SOURCES:%.cpp=%.o)

# SOURCES := \
#   $(SRC)/main.cpp \
#   $(SRC)/SerialPort.cpp \
#   $(SRC)/ShadowUpdate.cpp \
#   $(SRC)/SRecord.cpp

# OBJECTS := \
#   $(SRC)/SerialPort.o \
#   $(SRC)/ShadowUpdate.o \
#   $(SRC)/SRecord.o

EXECUTABLE := main

#
# Targets
#
.PHONY: clean all
all: $(BIN)/$(EXECUTABLE)

clean:
    $(RM) $(BIN)/$(EXECUTABLE)
    $(RM) $(OBJECTS)

run: all
    ./$(BIN)/$(EXECUTABLE)

# $(BIN)/$(EXECUTABLE): $(SRC)/*
$(BIN)/$(EXECUTABLE): $(OBJECTS)
    $(CXX) $(CXXFLAGS) -I$(INCLUDE) -L$(LIB) $^ -o $@ 

#
# Dependencies - must be at end of makefile
#
DEPDIR := .d
$(shell mkdir -p $(DEPDIR) >/dev/null)
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td

POSTCOMPILE = @mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d && touch $@

%.o: %.c
%.o: %.c $(DEPDIR)/%.d
    $(CC) -c -o $*.o $(DEPFLAGS) $(CFLAGS) $<
    $(POSTCOMPILE)

%.o: %.cpp
%.o: %.cpp $(DEPDIR)/%.d
    $(CXX) -c -o $*.o $(DEPFLAGS) $(CXXFLAGS) $<
    $(POSTCOMPILE)

$(DEPDIR)/%.d: ;
.PRECIOUS: $(DEPDIR)/%.d

include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SOURCES))))

它适用于注释掉的目标:# $(BIN)/$(EXECUTABLE): $(SRC)/*

但是,我希望能够拥有一个比简单地列出所有源文件作为可执行文件的依赖项更复杂的项目。

这是我的文件树:

src/
src/SerialPort.cpp
src/SRecord.cpp
src/ShadowUpdate.cpp
src/main.cpp
include
include/ShadowUpdate.h
include/SerialPort.h
include/SRecord.h
include/the_exo.h
bin/
bin/main
Makefile
lib/
.d/

自动依赖项生成也不起作用,即使它是直接来自 GNU 网站的。

最佳答案

想想 %

中扩展成什么
%.o: %.cpp $(DEPDIR)/%.d

插入src/SRecord.o:

src/SRecord.o: src/SRecord.cpp .d/src/SRecord.d

你能看到这个问题吗?请尝试以下操作

$(SRC)/%.o: $(SRC)/%.cpp $(SRC)/$(DEPDIR)/%.d

您不需要覆盖内置配方的行(%.o: %.cpp),请将其删除。

关于c++ - linux C++ gmake "No rule to make target",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50570490/

相关文章:

linux - 如何交叉编译 arm64 的 lttng-modules?

C++ 重载 + 运算符导致错误

c++ - 动态分配的矩阵读取不正确

c++ - 将 Windows 视觉主题与 Code::Blocks 一起使用?

makefile - 仅限订单的先决条件在 GNU make 中无法正常工作?

makefile - 如何将目标文件放置在单独的子目录中

c++ - 两个数组之间的共同功能?

linux - 删除通讯输出中的空格

linux - make命令的参数

linux - forkIO/killThread 与 forkProcess 的交互