11.使用make更新歸檔檔案

ignorantshr發表於2019-01-06

本系列文章均翻譯自make官方文件:make Manual,github同步專案:question

Archive files(歸檔檔案)是包含了sub-files的檔案,sub-files被稱做members;它們被ar程式維護,主要用途是為連結作為子程式庫。

歸檔成員作為目標

一個單獨的歸檔檔案成員可以被作為一個target或者prerequisite

archive(member)

此結構只能在targetprerequisites中使用。最好使用ar來管理。
通過複製hack.o在foolib中建立一個成員hack.o檔案:

foolib(hack.o) : hack.o
        ar cr foolib hack.o

事實上幾乎所有的歸檔成員目標都以這種方式更新並且有一個預設規則為你做這件事。如果歸檔檔案不存在則需要為ar加上cflag。

指定多個成員:

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

相關文章