源外生成与目标文件的规则不匹配

Out-of-source build doesn't match rule for object files

本文关键字:文件 规则 不匹配 目标      更新时间:2023-10-16

我正在尝试根据我在此博客文章中发现的模板来设置C 项目的材料构建的makefile。但是,由于某种原因,模式匹配的目标$(BUILD_DIR)/$.cpp.o:似乎无法正常工作,因为我会遇到"没有规则来制作目标'build/somefile.cpp.o"的错误。

这是我的makefile,其中一些不必要的细节已删除。请注意,SRCS变量是由其他变量构建的,因为我最终想使用不同的源文件支持不同的目标,但是目前SRCS只有一个定义,可以在一行中定义。

CXX = g++
RM = rm -f
MKDIR_P ?= mkdir -p
SRC_DIR := ./src
BUILD_DIR := ./build
CPPFLAGS := -std=c++14 -g3 -O0 -Wall
LFLAGS := -L"./libraries/mutils"
INCLUDES := -I"$(SRC_DIR)/" -I"./libraries/"
LIBS := -lmutils -lpthread
OBJS = $(SRCS:$(SRC_DIR)/%=$(BUILD_DIR)/%.o)
DEPS = $(OBJS:.o=.d)
COMMON_SRCS := sourcefile1.cpp sourcefile2.cpp sourcefile3.cpp sourcefile4.cpp
COMMON_SRCS := $(addprefix $(SRC_DIR)/,$(COMMON_SRCS))
COMMON_SRCS += $(shell find $(SRC_DIR)/util -name *.cpp)
SIM_SRCS := $(shell find $(SRC_DIR)/simulation -name *.cpp)
SIM_SRCS += $(SRC_DIR)/SimulationMain.cpp
$(BUILD_DIR)/%.cpp.o: %.cpp
    $(MKDIR_P) $(dir $@)
    $(CXX) $(CPPFLAGS) $(INCLUDES) -c $< -o $@  
SRCS = $(COMMON_SRCS) $(SIM_SRCS)
build/simulation: $(OBJS)
    $(CXX) $(LFLAGS) $(OBJS) -o $@ $(LIBS)
.PHONY: clean
clean:
    $(RM) -r $(BUILD_DIR)
-include $(DEPS)

如果我尝试使用make build/simulation运行此操作,则获得*** No rule to make target 'build/sourcefile1.cpp.o', needed by 'build/simulation'. Stop.这是OBJS列表中的第一个文件,因此似乎可以扩展所有变量,但无法将单个对象文件匹配到规则。这里可能出了什么问题?

我的第一个想法是问题是build_dir中的 ./,并且使build/sourcefile1.cpp.o与规则./build/%.cpp.o : %.cpp匹配,但是如果我从build_dir和src_dir中删除./,我会遇到完全相同的错误。

<</p>

出了什么问题

问题是由这一行引起的:

$(BUILD_DIR)/%.cpp.o: %.cpp

%根据左侧为sourcefile1,因此扩展的线路看起来像这样,并且图案被忽略:

$(BUILD_DIR)/sourcefile1.cpp.o: sourcefile1.cpp

您需要在权利上获得src/sourcefile1.cpp才能使此规则起作用。

如何修复

您可以将行更改为:

$(BUILD_DIR)/%.cpp.o: $(SRC_DIR)/%.cpp

或使对象文件的路径包括src/(即,不要从其路径中删除$(SRC_DIR)零件):

OBJS = $(SRCS:%=$(BUILD_DIR)/%.o)

两个解决方案都应等效,它们只是调整规则的不同部分。