源外生成与目标文件的规则不匹配
Out-of-source build doesn't match rule for object files
我正在尝试根据我在此博客文章中发现的模板来设置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中删除./
,我会遇到完全相同的错误。
出了什么问题
问题是由这一行引起的:
$(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)
两个解决方案都应等效,它们只是调整规则的不同部分。
- 生成文件不对文件使用隐式规则
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 生成文件中隐式规则中的 -c 标志出错
- C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
- 生成文件匹配规则和配方中的模式
- 如何在 c c ++ 混合生成文件中为 c 对象添加附加规则?
- 无法通过 bazel 的规则成功包含外部头文件cc_library
- 在不应该应用生成文件规则时应用
- 生成文件:没有规则的依赖项不会使父项无效
- 生成文件:子目录的模式规则
- Visual Studio 2017 加载规则集文件时出错
- 在makefile中更改构建规则以构建多种文件类型
- 源外生成与目标文件的规则不匹配
- 生成:没有创建头文件的规则
- 生成文件失败,错误没有规则来设定目标
- 将 Icon 添加到可执行文件 (Eclipse CDT Luna) 时出现问题:make: *** 没有规则来制作目标 'resources.o'
- GNU 生成文件规则和依赖关系
- C++:同名的文件范围常量违反了一个定义规则
- 我如何理解这个生成文件规则的细节
- Solaris Imakefile复制文件规则