本系列文章均翻译自make官方文档:make Manual,github同步项目:question
Archive files(归档文件)是包含了sub-files的文件,sub-files被称做members;它们被ar
程序维护,主要用途是为链接作为子程序库。
归档成员作为目标
一个单独的归档文件成员可以被作为一个target或者prerequisite。
archive(member)
此结构只能在target和prerequisites中使用。最好使用ar
来管理。
通过复制hack.o在foolib中创建一个成员hack.o文件:
foolib(hack.o) : hack.o
ar cr foolib hack.o
事实上几乎所有的归档成员目标都以这种方式更新并且有一个默认规则为你做这件事。如果归档文件不存在则需要为ar
加上c
flag。
指定多个成员:
foolib(hack.o kludge.o)
使用通配符:
foolib(*.o)
归档成员目标的隐含规则
make “foo.a(bar.o)”:
cc -c bar.c -o bar.o
ar r foo.a bar.o
rm -f bar.o
成员不能包括一个目录名,但是在一个makefile中可能是有用的来假装它确实存在(but it may be useful in a makefile to pretend that it does)。
foo.a(dir/file.o)
-> ar r foo.a dir/file.o
。???
更新归档标志文件夹
归档文件中有一个特殊的成员__.SYMDEF
,是一个包含了额外的被所有其他成员定义的标志名的文件夹。
更新了成员之后,通过ranlib
需要更新此成员。
libfoo.a: libfoo.a(x.o) libfoo.a(y.o) …
ranlib libfoo.a
使用ar
进行更新时,会自动更新此成员。
note:如果多个ar
同时在一个归档文件中执行,不能输出正确地结果。
归档文件的后缀规则
过时写法:
.c.a:
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
$(AR) r $@ $*.o
$(RM) $*.o
匹配写法:
(%.o): %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o
$(AR) r $@ $*.o
$(RM) $*.o