【发布时间】:2013-07-05 13:29:03
【问题描述】:
我想用一个 Makefile 编译两个稍微不同版本的 C 代码。
基本上我只需要添加一些Flags和一些源文件。
现在我有一个源列表的定义:
SRC := <adding stuff>
并从中生成我的对象:
OBJ = $(SRC:%.c=$(OBJS_DIR)/%.o) $(ASRC:%.s=$(OBJS_DIR)/%.o)
“all”目标应该可以正常编译,“iomodule”目标改变vars并调用“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列表里?这是怎么回事??
【问题讨论】:
-
make -d告诉你什么? -
@meaning-matters 你的意思可能是
make -n? -
@devnull
-d在调试中。