gpt4 book ai didi

c++ - 源外构建与目标文件的规则不匹配

转载 作者:行者123 更新时间:2023-11-30 02:28:25 26 4
gpt4 key购买 nike

我正在尝试根据我在 this blog post 上找到的模板为 C++ 项目的源外build设置 Makefile .但是,出于某种原因,模式匹配目标 $(BUILD_DIR)/$.cpp.o: 似乎不起作用,因为我收到类似“No rule to make target '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/模拟'。停止。 这是 OBJS 列表中的第一个文件,因此 Make 似乎扩展了所有变量,但随后无法将单个目标文件与规则匹配。这里可能出了什么问题?

我的第一个想法是问题出在 BUILD_DIR 中的 ./,Make 无法将 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++ - 源外构建与目标文件的规则不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40772254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com