以下是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_SRC
和out/myfile.asm.s.o
因此要MY_OBJ
和MY_DEP
.包含二进制文件 因为MY_DEP := $(MY_OBJ:.c.o=.c.d)
.s.o
完好无损。
更新:为了更准确地说明时间线,
make
,在看到-include $(MY_DEP)
后,决定可以重制 从隐式规则请求.s.so
文件;没有错误 点,即使无法重拍- 构建显示
.s.so
@echo
输出但不显示$(CC)
命令行(因为$(Q)
似乎扩展到@
);尚无错误 - 读取
.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)
)不同。