makefile先决条件显示为较旧,然后是目标,即使它是在之后构建的

时间:2014-04-25 20:00:34

标签: c makefile static-libraries prerequisites

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

我的makefile结构是这样的:

./src/drv/platform/AVR/
     - hal
     - hw
     --- spi
     --- uart
  1. hal中,我在名为$(LIB_TARGET)的{​​{1}}中定义了一个库名称,并且所有libHal文件都应该存档在该库中。
  2. *.o我在名为hw的{​​{1}}中定义了另一个图书馆名称,$(LIB_TARGET)libHw中的所有*.o文件都应该包含在库:首先使用hw/spi中的目标文件创建库hw/uart并且永远不会错过它们,然后创建libHw中的对象并将其添加到hw/spi
  3. 在每个子目录中,运行带有后缀规则的通用makefile,创建目标文件,然后将每个hw/uart添加到库中。在运行结束时,我应该在另一个库目录中(如在另一个位置)2个库,libHw*.olibHal包含libHw中的所有内容,{{ 1}} libHal中的所有内容。
  4. 在这种情况下,目录hal没有任何源文件,如下所示:

    libHw

    每个hwhw子目标都包含这样的内容:

    SUBDIRS:= spi uart
    LIB_TARGET = libHw.a
    
    .PHONY: $(SUBDIRS) clean all
    
    default: all
    
    $(SUBDIRS)::
        $(MAKE) -C $@ $(MAKECMDGOALS)
    
    all clean : $(SUBDIRS)
    

    文件uart仅包含通用平台定义。

    包含所有后缀规则的通用makefile spi的代码。

    include $(TGT_BASE)/make/generic.mk
    
    SRCS  := uart.c
    
    include $(TGT_BASE)/make/rules.mk
    

    大多数

    中存在的makefile

    现在问题是有时generic.mk中的某些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 中定义的库中。在调试中运行make会发现make本身认为库的先决条件比上次访问库更早,所以错过了它们。

    *.o

    为了更好地解释它在这里工作的方式是一个例子

    hw/uart

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

    hw

    我正在使用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不要错过那些对象?或者查看他们的实时创建并将其正确添加到库中?请记住,有时会添加它们,但有时它们不会添加。

    谢谢。

1 个答案:

答案 0 :(得分:0)

当你说它与make all --debug=a一起运行时总能正常工作时,它始终有效:哪部分重要?如果您运行make all它是否始终有效?或者,如果您运行make --debug=a,它是否始终有效?或者你必须使用它们才能使它始终有效吗?

由于您没有显示所有的makefile,我们不能说太多。例如,您如何设置OBJS的值?您在何处以及如何定义构建目标文件的规则(或者您是否正在使用make的内置规则)?这些信息至关重要。看起来发生的事情是make要求你构建一个文件,但是你的规则构建了一个不同的文件,因此make看到它所期望的文件实际上没有更新,也没有做任何事情。

另外,在您的概述中,您会谈论dir1dir2dir2.1等内容,但在您提供的错误输出中却非常令人困惑不同的路径。我们无法确定&#34;真实&#34;示例中的路径名与概览中的伪路径匹配。

请在任何地方使用实际路径,或编辑示例输出以使用伪路径,这样我们就可以看到哪些路径正在做什么。