【发布时间】:2022-01-09 00:00:22
【问题描述】:
这是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.ssource 文件,所以我添加了:
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 行可以解决问题?这条线的目的到底是什么?
【问题讨论】:
-
include之前可能没有空行。很难通过 stackoverflow 解决空白问题,特别是如果您不提供完整的确切文件。 -
@Jester 我确实有空行。事实上,我什至没有触及 Makefile 的最后几行。如上所述,我只添加了
.s支持。 -
out/myfile.asm.s.o被包括在内,因为MY_DEP := $(MY_OBJ:.c.o=.c.d)没有将.s.o转换为.d? -
是的,很好!即使是这样,我想知道
.d文件是否为汇编正确生成。 -
虽然 gnu 汇编器确实支持通过
-MD生成依赖项,但 gcc 似乎没有调用它。您只需要编写一个单独的规则来直接通过汇编程序生成依赖项。
标签: c assembly makefile gnu-make