c语言 - 在生成文件中处理程序集文件 - 包含语句问题?



以下是Makefile的一部分:

MY_SRC += 
scr1.c 
src2.c 
src3.c
BUILD_PATH=outdir
MY_OBJ := $(addprefix $(BUILD_PATH)/,$(addsuffix .o, $(MY_SRC)))
MY_DEP := $(MY_OBJ:.c.o=.c.d)
.
.
.
$(BUILD_PATH)/%.c.o: %.c
@echo "  CC      $<"
$(CC) $< -c $(CFLAGS) $(call MDOPT,$(@:.c.o=.c.d)) -o $@
.
.
.
-include $(MY_DEP)

MDOPT定义为MDOPT = -MMD -MF $(1)

我需要添加程序集.asm.s源文件,所以我添加了:

MY_SRC += myfile.asm.s
.
.
.
$(BUILD_PATH)/%.s.o: %.s
@echo "  ASM     $<"
$(Q)$(CC) $< -c $(CFLAGS) -o $@

但是,在尝试编译源代码时,它给了我错误:

ASM myfile.asm.s out/myfile.asm.s.o:1: *** missing separator.  Stop.

我找到了以下修复程序 - 删除 Makefile 中的最后一行:-include $(MY_DEP).

导致错误的原因是什么?
为什么删除-include行可以解决问题?这条线的目的是什么?

是什么导致了错误?

错误消息表明二进制文件中存在语法错误out/myfile.asm.s.o.在包含时未检测到错误,因为 使用了-include指令(尝试info make include,靠近 完)。myfile.asm.s附加到MY_SRCout/myfile.asm.s.o因此要MY_OBJMY_DEP.包含二进制文件 因为MY_DEP := $(MY_OBJ:.c.o=.c.d).s.o完好无损。

更新:为了更准确地说明时间线,

  1. make,在看到-include $(MY_DEP)后,决定可以重制 从隐式规则请求.s.so文件;没有错误 点,即使无法重拍
  2. 构建显示.s.so@echo输出但不显示$(CC)命令行(因为$(Q)似乎扩展到@);尚无错误
  3. 读取.s.so并将其解析为 makefile,在第 1 行失败,并且 终止并显示错误消息(结束更新)

为什么移除-include线可以解决问题?

它跳过读取不是生成文件的out/myfile.asm.s.o

这条线的目的是什么?

请参阅info make 'Automatic Prerequisites'

该问题已分两步解决:

  • MY_DEP := $(MY_OBJ:.c.o=.c.d)没有接受.s汇编文件。此问题已通过以下方式修复:
MY_DEP_TEMP := $(MY_OBJ:.c.o=.c.d)
MY_DEP += $(MY_DEP_TEMP:.s.o=.s.d)
为了
  • 生成.d文件,需要更改编译.s文件的其他目标:
$(BUILD_PATH)/%.s.o: %.s
@echo "  AS     $<"
$(AS) $< -c $(ASFLAGS) $(call MDOPT_ASM,$(@:.s.o=.s.d)) -o $@

需要特别注意需要定义为MDOPT_AS = -MD $(1)MDOPT_ASM,这与.c目标(MDOPT_C = -MMD -MF $(1))不同。

最新更新