制作目标依赖源列表
Posted
技术标签:
【中文标题】制作目标依赖源列表【英文标题】:Make Target dependent source list 【发布时间】: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
在调试中。
【参考方案1】:
Make
命令(如 $(info)
)在加载 makefile 时立即进行评估。这就是为什么它显示$(SRC)
的“全局”值。
链接不包括您的目标文件的问题是,在加载文件时,依赖项也“评估”了。这意味着对于您的 all
目标,依赖项设置为 OBJ
是文件加载时的状态。
【讨论】:
具体而言,GNU make 手册中关于目标特定变量的部分说:与自动变量一样,这些值仅在目标配方的上下文中可用。这意味着您不能在先决条件列表中使用特定于目标的变量:它们只能在配方中使用。 那么有没有办法完成我想做的事情?我想根据制作目标添加一些模块。 ty @BenjaminMaurer 将源/对象文件添加到变量似乎工作正常,至少在我的 make 版本中。不过,$(info)
之类的东西不能这样工作。
@JoachimPileborg 问题可能是,我的 c 文件是由像“$(OBJS_DIR)/%.o: %.c”这样的隐式规则编译的?即使我将 OBJ 更改为“直接”变量 (:=) 我也有问题,我的 C 文件未编译但链接器尝试链接相应的 O 文件:(以上是关于制作目标依赖源列表的主要内容,如果未能解决你的问题,请参考以下文章