我想用一个 Makefile 编译两个稍微不同版本的 C 代码。
基本上我只需要添加一些标志和一些源文件。
现在我有我的源列表的定义:
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”会打印包含“iomod_ring_proto.c”的SRC,而OBJ,因为它是一个递归变量,会包含*.o文件。
奇怪的是,“info”会打印没有文件的列表,而“iomod_ring_proto.c”永远不会被编译。然而,我收到一个链接器错误,即找不到“objs/iomod_ring_proto.o”。所以我打印的时候不在SRC列表里,编译的时候不在OBJ列表里,但是链接的时候在OBJ列表里?这里发生了什么??