首页 > 解决方案 > 是什么在下面的代码中使 makefile 错误?

问题描述

我在第 98 行收到错误,我不明白为什么会发生此错误。

makefile:98: *** mixed implicit and normal rules.  Stop.

以下是第 98 行的代码行

$(SRC_C_OBJS): | $(OBJ_DIR)

以下是使用上述变量的代码:


    OBJ_DIR = .\build

   _C_SRCS = $(PROGRAM)_i.c \
            test_$(PROGRAM).c

  _ASM_SRCS = $(PROGRAM).S

  _REF_C_SRCS = $(PROGRAM)_c.c \
              test_$(PROGRAM).c


REF_OBJS = $(_REF_C_SRCS:%.c=$(REF_OBJ_DIR)\%.o)
SRC_C_OBJS   = $(_C_SRCS:%.c=$(OBJ_DIR)\%.o)
SRC_ASM_OBJS = $(_ASM_SRCS:%.S=$(OBJ_DIR)\%.obj)
SRC_C_OBJS += $(OBJ_DIR)/subsys.o

$(EXEC): $(SRC_C_OBJS) $(SRC_ASM_OBJS)
    $(LD) $(LDFLAGS) -o $@ $(SRC_C_OBJS) $(SRC_ASM_OBJS) $(LLIBS)

标签: makefile

解决方案


REF_OBJS = $(_REF_C_SRCS:%.c=$(REF_OBJ_DIR)\%.o)
SRC_C_OBJS   = $(_C_SRCS:%.c=$(OBJ_DIR)\%.o)
SRC_ASM_OBJS = $(_ASM_SRCS:%.S=$(OBJ_DIR)\%.obj)

The\%正在转义%,因此它被解释为文字%,而不是替换的字符串。/是 unix 平台上的目录分隔符,而不是\. 你要:

OBJ_DIR = ./build
REF_OBJS = $(_REF_C_SRCS:%.c=$(REF_OBJ_DIR)/%.o)
SRC_C_OBJS   = $(_C_SRCS:%.c=$(OBJ_DIR)/%.o)
SRC_ASM_OBJS = $(_ASM_SRCS:%.S=$(OBJ_DIR)/%.obj)

理论上,如果\是分隔符,你可以这样做:

REF_OBJS = $(_REF_C_SRCS:%.c=$(REF_OBJ_DIR)\\%.o)
SRC_C_OBJS   = $(_C_SRCS:%.c=$(OBJ_DIR)\\%.o)
SRC_ASM_OBJS = $(_ASM_SRCS:%.S=$(OBJ_DIR)\\%.obj)\

推荐阅读