制作目标依赖源列表

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 文件:(

以上是关于制作目标依赖源列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在ios framework中引用其他静态库

如何使用 select2 小部件 yii 制作依赖下拉列表

本地yum源制作

本地YUM源制作

如何使用 json 原始数据在 vuejs 中制作依赖的第二个列表?

内网RHEL6.5的ISO镜像上传至RHEL6.5服务器上制作本地安装依赖源