我想用一个Makefile编译两个略有不同版本的C代码。
基本上我只需要添加一些Flags和一些源文件。
现在我有源列表的定义:
SRC := <adding stuff>
并从中生成我的对象:
OBJ = $(SRC:%.c=$(OBJS_DIR)/%.o) $(ASRC:%.s=$(OBJS_DIR)/%.o)
“all”目标应该正常编译,“iomodule”目标更改变量并调用“all”:
.PHONY: iomodule
iomodule: CDEFS := $(subst -DFD_MODULE, -DIO_MODULE, $(CDEFS))
#iomodule: SRC += $(subst $(SRC_DIR)/,,$(wildcard $(SRC_DIR)/iomod*.c))
iomodule: SRC += iomod_ring_proto.c
iomodule: OBJ += $(OBJ_DIR)/iomod_ring_proto.o
#iomodule: $(info $(SRC))
iomodule: all
all: dirs STM32F100RB_FLASH.ld $(OBJ)
$(CC) -o $(TARGET).elf $(LDFLAGS) $(OBJ) $(LDLIBS)
$(OBJCOPY) -O ihex $(TARGET).elf $(TARGET).hex
$(OBJCOPY) -O binary $(TARGET).elf $(TARGET).bin
我原本以为“info”会打印SRC,包括“iomod_ring_proto.c”,而OBJ,因为它是一个递归变量,会包含* .o文件。
奇怪的是,“info”打印没有文件的列表,并且永远不会编译“iomod_ring_proto.c”。 然而,我收到链接器错误,找不到“objs / iomod_ring_proto.o”。 因此,当我打印它时,它不在SRC列表中,而不是在编译时在OBJ列表中,但在链接时它在OBJ列表中?这是怎么回事?
答案 0 :(得分:1)
加载makefile时会立即评估像Make
这样的$(info)
命令。这就是为什么它显示$(SRC)
的“全局”值。
链接不包括您的目标文件的问题是,在加载文件时,依赖项也“已评估”。这意味着对于all
目标,依赖关系设置为文件加载时的OBJ
。