在下面的代码中,是什么导致makefile错误?

在下面的代码中,是什么导致makefile错误?,makefile,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

我在第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)
\%
正在转义
%
,因此它被解释为一个文本
%
,而不是被替换的字符串。
/
是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)\

Make是在UNIX和POSIX路径上开发并使用的。POSIX路径没有驱动器规格(
C:
等),它们使用正斜杠(
/
)而不是反斜杠作为目录分隔符。Make不是为本机Windows路径(驱动器规格和反斜杠)设计的,也不能很好地使用本机Windows路径

特别是,make经常将驱动器规范中的
视为规则定义的一部分(注意在规则定义中
如何将目标与先决条件分开)。它还遵循标准UNIX/POSIX约定,反斜杠用于转义特殊字符(至少在某些地方)

所以。首先,在询问有关StackOverflow的问题时,请确保包括关键细节,如(a)您正在使用的操作系统和(b)您正在使用的工具的版本(在本例中为make)

其次,您上面给出的示例缺少绝对重要的细节:您没有将赋值包含到
REF\u OBJ\u DIR
程序
变量中。没有这一点,我们无法确切地确定问题是什么

通常,在编写makefile时,应该避免使用驱动器规格,并且应该使用正斜杠而不是反斜杠作为目录分隔符。大多数Windows程序将接受正向斜杠(只有某些旧的
command.com
程序不接受)。如果您必须使用驱动器规格,则需要获得make的一个版本,该版本经过编译以理解Windows路径


还有一件事,只是为了避免另一个常见问题:make不能很好地处理包含空格的路径。。。所以要避免它们。

这与cmake有什么关系?
SRC_C_OBJS
OBJ_DIR
的值是什么?请发布复制错误所需的所有相关信息,即创建一个。我想在我的计算机上出现同样的错误-我该怎么办?你可以检查编辑好的编码,然后添加例如
all:echo$(SRC\u C\u OBJS)
,看看里面到底是什么?错误消息是不能将
%
与常规规则混合,例如
normal%。implict:
无效。现在的问题是,
\u C\u SRCS
OBJ\u DIR
\u ASM\u SRCS
\u REF\u C\u SRCS
的值是什么……现在可能重复检查导致问题的地方我已经提供了您询问@KamilCuk的变量值
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)\