在将make
从3.81升级到4.3之后,我面临着一个奇怪的行为.
此生成文件使用旧的GNU语法描述静态库的构建:
LIBNAME = testlib.a
OBJ_FILES = \
$(LIBNAME)(test1.o) \
$(LIBNAME)(test2.o)
all: $(LIBNAME)
$(LIBNAME): $(OBJ_FILES)
$(RANLIB) $@
make
4.3的行为是,无论源文件是否已更改,都始终生成库.
在make -p
的输出中,make
似乎正在执行隐式规则并在目录中搜索test1.o
和test2.o
,但由于它们不在目录中,因此它从源代码生成新的它们,使用ar
命令添加它们,然后从目录中删除它们.
在版本3.81中,它直接签入test1.o
的testlib.a
,如果找到它,则不执行其他规则.
那么这个makefile必须重写吗,或者有没有其他的可能性来获得旧的行为?
编辑:
现在在另一个Linux Mint系统上进行了测试,GNU make
4.3,相同的行为.
正如MadScientist提到的,输出make --trace
:
<builtin>: update target 'test1.o' due to: test1.c
cc -c -o test1.o test1.c
<builtin>: update target 'testlib.a(test1.o)' due to: test1.o
ar rv -U testlib.a test1.o
r - test1.o
rm test1.o