2014-04-23 96 views
1

我正在做一个基于递归(有毒但无关紧要)构建系统。我遇到的主要问题是,即使没有对* o文件进行任何更改,也会重新创建指示它执行的库。即使没有任何变化,makefile也会重建静态库

这是我的makefile中处理静态库创建的部分。

all: $(DEPS) $(OBJS) $(LIB_TARGET) 

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

下在各自的makefile某些目录中,$(LIB_TARGET)的定义与库名称和每个子目录使用前缀的Makefile知道如何创建它的份额。 现在我最大的问题是,第一次运行创建所有内容是正常的,但是在第二次运行或每次后续运行中,代码中的任何内容都没有任何更改时,将重新创建库(但不是* d或* o文件,它们是不重新创建,它们不会被删除,它们的时间戳不会被更改,这是正常的)。

make -C modules all 
make[3]: Entering directory `F:/automata/tmp/remake/src/modules' 
make -C interface all 
make[4]: Entering directory `F:/automata/tmp/remake/src/modules/interface' 
make -C cli all 
make[5]: Entering directory `F:/automata/tmp/remake/src/modules/interface/cli' 
------- make Lib ------- 
Adding cli.o to library libInterface.a 
avr-ar rcs F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libInterface.a c 
li.o 
------- make Lib ------- 

注:此为第二/第三次运行,这里可以看出,* d和* O无重新

我创建的规则使用的文件,唯一的问题,我可以看到的是我把图书馆放在一个特殊的目录中,而不是像它从中获取资源的那个一样。 任何想法如何解决这个问题,而不是系统也重新创建库?

谢谢。

回答

2

只要你看到一个配方,它创建的目标文件不是就是[email protected],你知道这是错的,你将会遇到这个问题。

在这里,你告诉你要创建一个匹配模式%.a的目标。使匹配的模式为libInterface.a并将[email protected]设置为libInterface.a并调用您的配方。

但是你的食谱没有生成[email protected],它生成了$(LIBDIR)/[email protected]这是一个完全不同的文件。因此,下一次运行make时,它会查找libInterface.a作为all的先决条件,请确保它不存在,然后重新运行您提供的规则......这又不会创建您所告知的目标。 ,[email protected],而是创建一些其他文件使其不知道任何关于。

您需要使用:

LIB_TARGET = $(LIB_DIR)/libInterface.a 

.... 

### Archive into a library file (.a) 
$(LIB_DIR)/%.a: $(OBJS) 
     @echo $(MSG_L) 
     @echo 'Adding $< to library [email protected]' 
     $(AR) $(ARFLAGS) [email protected] $^ 
     @echo $(MSG_L) 
+0

谢谢你的回答和教训。我对制作的理解增加了很多逻辑。 – weaz

+0

此外,虽然它可能有效,但它有点......不寻常......以我的经验看到模式匹配规则('$(LIB_DIR)/%。a')没有引用某处的相应模式右边的':'...这个规则可能只是'$(LIB_TARGET):$(OBJS)',我认为它会更清晰...... – twalberg

+0

显然有一个问题我不明白。除了需要从子目录添加更多* .o文件的库之外,它工作正常。第一个obj文件已添加好,但第二个有时会错过。这很奇怪,因为它有时会增加它,有时却不会。 – weaz

相关问题