【问题标题】:No rule to make object files based on pattern没有根据模式制作目标文件的规则
【发布时间】:2017-12-18 18:02:07
【问题描述】:

您好,我正在尝试构建我的 C++ 项目。我目前有一个makefile,列出了我想要制作的所有.o 文件的名称。然后我将目录添加到我希望将它们编译到的位置。最后,我有两个基本规则来处理构建每个目标文件,然后是这些目标文件的可执行文件。无论出于何种原因,make 都无法识别该模式。这是makefile

CXX=g++
SRC_DIR=/home/epi/jfrye_xilinx/Cosimulation/SystemC/Xilinx/lib
INC_DIR=-I/home/epi/jfrye_xilinx/Cosimulation/SystemC/Xilinx/include
INC_DIR += -I/home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include

LIB_DIR=-L/home/epi/jfrye_xilinx/SystemC/system-2.3.2/lib-linux64
LIB_TAGS=-lsystemc

OBJ_DIR=/home/epi/jfrye_xilinx/Cosimulation/Adder_PL/obj

ZYNQ_DEMO=/home/epi/jfrye_xilinx/Cosimulation/Adder_PL/bin/zynq_demo
ZYNQMP_DEMO=/home/epi/jfrye_xilinx/Cosimulation/Adder_PL/bin/zynqmp_demo

OBJS+ = memory.o trace.o debugdev.o demo-dma.o xilinx-zynq.o xilinx-zynqmp.o
OBJS += safeio.o remote-port-proto.o remote-port-sk.o remote-port-tlm.o
OBJS += remote-port-tlm-memory-master.o remote-port-tlm-memory-slave.o
OBJS += remote-port-tlm-wires.o

_ZYNQ_OBJS=zynq_demo.o
_ZYNQMP_OBJS=zynqmp_demo.o

_ZYNQ_OBJS += $(OBJS)
_ZYNQMP_OBJS += $(OBJS)

ZYNQ_OBJS=$(addprefix $(OBJ_DIR)/, $(_ZYNQ_OBJS))
ZYNPMP_OBJS=$(addprefix $(OBJDIR)/, $(_ZYNQMP_OBJS))

$(info $(ZYNQ_OBJS))

all: $(ZYNQ_DEMO) $(ZYNQMP_DEMO)

$(ZYNQ_DEMO): $(ZYNQ_OBJS)

$(ZYNQMP_DEMO): $(ZYNQMP_OBJS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cc
    $(CXX) $(INC_DIR) $(LIB_DIR) $(LIB_TAGS) -c -o $@ $<

我收到错误:

make: *** 没有制定目标的规则 /home/epi/jfrye_xilinx/Cosimulation/Adder_PL/obj/zynq_demo.o', needed by/home/epi/jfrye_xilinx/Cosimulation/Adder_PL/bin/zynq_demo'。 停下来。

第四条规则应该照顾到zynq_demo.o 正确。为什么它无法识别可用于构建该目标文件的规则?

【问题讨论】:

  • 更简单的方法是使用$(vpath),根本不明确指定源目录。
  • 源码目录下有没有对应的.cc文件/home/epi/jfrye_xilinx/Cosimulation/SystemC/Xilinx/lib
  • 不,这就是问题所在。我不知道它会抱怨没有规则,即使它可以在列表中找到目标文件名
  • 你真的是想在你的makefile中写OBJS+ = memory.o...吗?不是语法错误,但也不是你想要的。

标签: makefile gnu-make


【解决方案1】:

我不喜欢模式规则。 它们适用的时间和地点对我来说有点随意。 恕我直言,更好的替代方案是 static pattern rules。 要使用这些,只需在您的模式规则前面加上这些模式适用的目标即可。

所以

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cc
    $(CXX) $(INC_DIR) $(LIB_DIR) $(LIB_TAGS) -c -o $@ $<

变成了

${ZYNC_OBJS}: $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cc
    $(CXX) $(INC_DIR) $(LIB_DIR) $(LIB_TAGS) -c -o $@ $<

我不知道,因为我没有你的源代码树, 但我怀疑 make 现在会给你一个不同的错误。 /home/epi/jfrye_xilinx/Cosimulation/SystemC/Xilinx/lib/zynq_demo.cc 可能会丢失(???)。

【讨论】:

    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 2023-03-18
    • 2018-04-09
    • 2014-03-10
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多