gpt4 book ai didi

c - makefile 先决条件看起来比目标更旧,即使它是在之后构建的

转载 作者:行者123 更新时间:2023-11-30 17:34:32 25 4
gpt4 key购买 nike

我正在尝试将在不同目录中创建的多个文件添加到静态库,但显然它无法按预期工作。

我的 makefile 结构是这样的:

./src/drv/platform/AVR/
- hal
- hw
--- spi
--- uart
  1. hal 中,我在 $(LIB_TARGET) 中定义了一个名为 libHal 的库名称以及所有 *.o 文件应存档在该库中。
  2. hw 中,我在 $(LIB_TARGET) 中定义了另一个库名称,名为 libHw 和所有 *.o hw/spihw/uart 中的文件应放入该库中:首先使用 中的目标文件创建库 libHw hw/spi 并且它们永远不会丢失,然后创建 hw/uart 中的对象并将其添加到 libHw 中。
  3. 在每个子目录中,都会运行一个带有后缀规则的通用 makefile,用于创建目标文件,然后将每个 *.o 添加到库中。运行结束时,我应该在另一个库目录中(如在另一个位置)有 2 个库,libHallibHwlibHal 包含所有内容在 hal 中,libHw 中的所有内容在 hw 中。

在本例中,目录 hw 没有任何源文件,如下所示:

SUBDIRS:= spi uart
LIB_TARGET = libHw.a

.PHONY: $(SUBDIRS) clean all

default: all

$(SUBDIRS)::
$(MAKE) -C $@ $(MAKECMDGOALS)

all clean : $(SUBDIRS)

每个 uartspi 子目录都包含如下内容:

include $(TGT_BASE)/make/generic.mk

SRCS := uart.c

include $(TGT_BASE)/make/rules.mk

文件generic.mk仅包含通用平台定义。

带有所有后缀规则的通用 makefile rules.mk 的代码。

.PHONY : all clean

OBJS = $(SRCS:.c=.o)
DEPS = $(OBJS:.o=.d)
LIB_TARGETT = $(LIB_DIR)/$(LIB_TARGET)

### Archive into a library file (.a)
$(LIB_DIR)/%.a: $(OBJS)
@echo $(MSG_L)
@echo 'Adding $^ to library $@'
$(AR) $(ARFLAGS) $@ $^
@echo $(MSG_L)

### rule for c files
%.o: %.c
@echo $(MSG_C)
$(CC) -c $(CFLAGS) $(MODULES_INC) $(TGT_LOCAL_INCLUDES) $< -o $@
@echo $(MSG_C)

### make dependencies
%.d: %.c
@echo $(MSG_D)
$(CC) -E -MM $(CFLAGS) $(MODULES_INC) $(TGT_LOCAL_INCLUDES) $(CURDIR)/$< > $@
@echo $(MSG_D)

all: $(DEPS) $(OBJS) $(LIB_TARGETT)

clean:
$(RM) -rf *.o *.d .depend

大多数情况下都存在的makefile

现在的问题是,有时hw/uart中的一些*.o文件没有添加到hw中定义的库中。在调试中运行 make 表明 make 本身认为库的先决条件比上次访问库的先决条件更旧,因此它们被错过。

Found an implicit rule for 'F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libHw.a'.
Pruning file 'uart.o'.
Finished prerequisites of target file 'F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libHw.a'.
Prerequisite 'uart.o' is older than target 'F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libHw.a'.

为了更好地解释这是如何工作的,这里有一个例子

make[7]: Entering directory 'F:/automata/tmp/remake/src/drv/platform/AVR/hw/uart
'
-------- make c --------
avr-gcc -c -Wall -Werror -Os -mmcu=atmega328p -IF:/automata/tmp/remake//tmp/ap
p/brick -IF:/automata/tmp/remake/src/common/h -IF:/automata/tmp/remake/src/drv/p
latform/AVR/hw/spi -IF:/automata/tmp/remake/src/drv/platform/AVR/hw/uart -IF:/au
tomata/tmp/remake/src/modules/interface/cli -IF:/automata/tmp/remake/src/drv/pl
atform/AVR/hw/uart uart.c -o uart.o
-------- make c --------
------- make Lib -------
Adding uart.o to library F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/li
bHw.a
avr-ar rcs F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libHw.a uart.o
------- make Lib -------
make[7]: Leaving directory 'F:/automata/tmp/remake/src/drv/platform/AVR/hw/uart'

这是一个示例,如果它不工作

make[7]: Entering directory 'F:/automata/tmp/remake/src/drv/platform/AVR/hw/uart
'
-------- make c --------
avr-gcc -c -Wall -Werror -Os -mmcu=atmega328p -IF:/automata/tmp/remake//tmp/ap
p/brick -IF:/automata/tmp/remake/src/common/h -IF:/automata/tmp/remake/src/drv/p
latform/AVR/hw/spi -IF:/automata/tmp/remake/src/drv/platform/AVR/hw/uart -IF:/au
tomata/tmp/remake/src/modules/interface/cli -IF:/automata/tmp/remake/src/drv/pl
atform/AVR/hw/uart uart.c -o uart.o
-------- make c --------
make[7]: Leaving directory 'F:/automata/tmp/remake/src/drv/platform/AVR/hw/uart'

我正在使用 make 3.82.90Windows 7

那么知道如何强制 make 不会错过这些对象吗?或者查看它们的实时创作时间并将它们正确添加到库中?请记住,有时会添加它们,但有时则不会。

谢谢。

最佳答案

当你说它总是有效时,当你使用 make all --debug=a 运行它时,它总是有效:哪一部分重要?如果你运行make all它总是有效吗?或者,如果您运行 make --debug=a ,它总是有效吗?还是必须同时使用两者才能使其始终有效?

由于您没有显示所有 makefile,所以我们不能说太多。例如,您如何设置 OBJS 的值?您在哪里以及如何定义构建目标文件的规则(或者您是否使用 make 的内置规则)?该信息至关重要。看起来发生的情况是 make 要求您构建一个文件,但您的规则构建了一个不同的文件,因此 make 发现它期望的文件实际上并未更新,并且没有执行任何操作。

此外,在您的概述中,您谈论诸如 dir1dir2dir2.1 等内容,这非常令人困惑,但随后在错误输出中,您提供了完全不同的路径。我们无法确定示例中的“真实”路径名如何与概述中的伪路径相匹配。

请在各处使用真实路径,或者编辑示例输出以使用伪路径,以便我们可以看到哪些路径在做什么。

关于c - makefile 先决条件看起来比目标更旧,即使它是在之后构建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23301961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com