C 使目标依赖源列表

C 使目标依赖源列表,c,makefile,gnu-make,C,Makefile,Gnu Make,我想用一个Makefile编译两个略有不同的C代码版本 基本上我只需要添加一些标志和一些源文件 现在我对我的源列表有了一个定义: SRC := <adding stuff> “all”目标应正常编译,“iomodule”目标更改变量并调用“all”: 我原以为“info”会打印SRC,包括“iomod_ring_proto.c”,而OBJ,因为它是一个递归变量,会包含*.o文件 奇怪的是,“info”打印列表时没有文件,“iomod\u ring\u proto.c”从未编译过。

我想用一个Makefile编译两个略有不同的C代码版本

基本上我只需要添加一些标志和一些源文件

现在我对我的源列表有了一个定义:

SRC := <adding stuff>
“all”目标应正常编译,“iomodule”目标更改变量并调用“all”:

我原以为“info”会打印SRC,包括“iomod_ring_proto.c”,而OBJ,因为它是一个递归变量,会包含*.o文件

奇怪的是,“info”打印列表时没有文件,“iomod\u ring\u proto.c”从未编译过。 但是我得到一个链接器错误,没有找到“objs/iomod\u ring\u proto.o”。
所以当我打印它时它不在SRC列表中,编译时它不在OBJ列表中,但是链接时它在OBJ列表中?这里发生了什么事???

加载makefile时,会立即评估
Make
命令,如
$(info)
。这就是它显示
$(SRC)
的“全局”值的原因


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

make-d
告诉您什么?@意义很重要您可能是指调试中的
make-n
?@devnull
-d
。具体来说,目标特定变量的GNU make手动部分说:与自动变量一样,这些值仅在目标配方的上下文中可用。这意味着你不能在先决条件列表中使用特定于目标的变量:它们只在配方中起作用。那么有没有办法完成我想做的事情呢?我想根据make目标添加几个模块。ty@BenjaminMaurer将源/对象文件添加到变量似乎效果不错,至少在我的make版本中是这样。像
$(info)
这样的东西并不是这样工作的。@JoachimPileborg问题可能是,我的c文件是由一个隐式规则编译的,比如“$(OBJS_DIR)/%.o:%.c”?即使我将OBJ更改为“direct”变量(:=),我也有一个问题,即我的C文件未编译,但链接器尝试链接相应的O文件:(
OBJ = $(SRC:%.c=$(OBJS_DIR)/%.o) $(ASRC:%.s=$(OBJS_DIR)/%.o)
.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