0

我想用一个 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列表里?这里发生了什么??

4

1 回答 1

1

加载 makefile 时立即评估类似的Make命令。$(info)这就是为什么它显示$(SRC).

链接不包括您的目标文件的问题是,在加载文件时也会“评估”依赖项。这意味着对于您的all目标,依赖项设置为OBJ加载文件时的状态。

于 2013-07-05T13:43:02.233 回答