我正在做一个基于递归(有毒但无关紧要)构建系统。我遇到的主要问题是,即使没有对* 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无重新
我创建的规则使用的文件,唯一的问题,我可以看到的是我把图书馆放在一个特殊的目录中,而不是像它从中获取资源的那个一样。 任何想法如何解决这个问题,而不是系统也重新创建库?
谢谢。
谢谢你的回答和教训。我对制作的理解增加了很多逻辑。 – weaz
此外,虽然它可能有效,但它有点......不寻常......以我的经验看到模式匹配规则('$(LIB_DIR)/%。a')没有引用某处的相应模式右边的':'...这个规则可能只是'$(LIB_TARGET):$(OBJS)',我认为它会更清晰...... – twalberg
显然有一个问题我不明白。除了需要从子目录添加更多* .o文件的库之外,它工作正常。第一个obj文件已添加好,但第二个有时会错过。这很奇怪,因为它有时会增加它,有时却不会。 – weaz