2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

GNU make中文手冊-第十一章:使用make更新靜態(tài)庫文件

 todaytomo 2006-12-30
GNU make中文手冊-第十一章:使用make更新靜態(tài)庫文件 作者: hew  發(fā)布日期: 2006-3-21    查看數(shù): 132   出自: http://www.
第十一章:使用make更新靜態(tài)庫文件

--------------------------------------------------------------------------------

靜態(tài)庫文件也稱為“文檔文件”,它是一些.o文件的集合。在Linux(Unix)中使用工具“ar”對它進(jìn)行維護(hù)管理。它所包含的成員(member)就是若干.o文件。

11.1 庫成員作為目標(biāo)
一個靜態(tài)庫通常由多個成員(.o文件)組成。靜態(tài)庫文件的成員可獨立被作為一個規(guī)則的目標(biāo),將庫成員作為目標(biāo)時需要按照如下的格式來書寫:



ARCHIVE(MEMBER)



注意,這種書寫方式只能出現(xiàn)在規(guī)則的目標(biāo)和依賴文件中,不能出現(xiàn)在規(guī)則的命令行中!因為,絕大多數(shù)命令不能支持這種表示的語法,它們不能直接對庫的成員進(jìn) 行操作。這種表達(dá)式在規(guī)則的目標(biāo)或者依賴中,它表示庫“ARCHIVE”的成員“MEMBER”。含有這種表達(dá)方式規(guī)則的命令行只能是“ar”命令或者其 它可以對庫成員進(jìn)行操作的命令。例如:下邊規(guī)則創(chuàng)建了庫“foolib”,并將“hack.o”成員納入到庫:



foolib(hack.o) : hack.o

ar cr foolib hack.o



實際上,這個規(guī)則實現(xiàn)對庫的所有成員的更新,其過程使用了隱含規(guī)則來創(chuàng)建.o文件。另外需要注意工具“ar”的使用。

如果規(guī)則中需要同時指定一個庫中的多個成員,可以將多個成員羅列在括號內(nèi),下邊那樣:



foolib(hack.o kludge.o)



它就等價于:



foolib(hack.o) foolib(kludge.o)



在描述的多個成員時也可以使用shell的通配符。例如:“foolib(*.o)”,它代表庫文件“foolib”的所有.o成員。

11.2 靜態(tài)庫的更新
上一節(jié)已經(jīng)講述了規(guī)則中形如“A(M)”目標(biāo)的含義,它表示規(guī)則的目標(biāo)是靜態(tài)庫“A”的成員“M”。在make為這樣一個目標(biāo)搜索隱含規(guī)則時,對于滿足“(M)”的隱含規(guī)則,同樣也被認(rèn)為是滿足“A(M)”這個目標(biāo)的隱含規(guī)則。

這樣就出現(xiàn)了一個特殊的模式規(guī)則,它的目標(biāo)模式是“(%)”。這個特殊的規(guī)則用來更新目標(biāo)“A(M)”,規(guī)則將文件“M”拷貝到庫“A”中,如果靜態(tài)庫文 件“A”不存在,則會創(chuàng)建這個庫文件。例如:如果一個目標(biāo)為“foo.a(bar.o)”,那么規(guī)則將完成:首先使用隱含規(guī)則生成“bar.o”文件,之 后將“bar.o”加入到庫“foo.a”中。那么“bar.o”就作為庫文件“foo.a”的一個成員(當(dāng)然如果“foo.a”不存在,就會被創(chuàng)建件。 此特殊規(guī)則的命令行一般都是“ar”命令)。

這個特殊的規(guī)則可以和其它的隱含規(guī)則一起構(gòu)成一個隱含規(guī)則鏈。因此我們可以直接在命令行中執(zhí)行“make ‘foo.a(bar.o)’”(注意“foo.a(bar.o)”作為命令行選項,需要使用引號,否則shell會將“(”作為特殊字符對待),只要當(dāng) 前目錄下存在“bar.c”這個文件,就會執(zhí)行如下命令:



cc -c bar.c -o bar.o

ar r foo.a bar.o

rm -f bar.o



我們注意到了“bar.o”時被作為中間過程文件處理的。參考 make的隱含規(guī)則鏈 一節(jié)。需要說明的是,包含上述命令的規(guī)則,在規(guī)則的命令行中使用自動化變量“$%”來代替“bar.o”。參考 自動化變量 一小節(jié)

一個靜態(tài)庫(文檔文件)中,其所有的成員名是不包含目錄描述的。就是說對于靜態(tài)庫,當(dāng)使用“nm”命令查看其成員時,能夠獲得的信息只是靜態(tài)庫所包含的成 員(一系列.o文件,文件名中并沒有包含目錄)。不能得知靜態(tài)庫在創(chuàng)建時它的每一個成員所在的目錄情況。但我們在Makefile中,采用“A(M)”格 式的目標(biāo),書寫建立(重建或者更新)靜態(tài)庫的規(guī)則時,可以指定它的成員來源于那個目錄。就是說我們可以對它的成員使用完整路徑的文件名進(jìn)行說明。Make 在處理這樣一個目標(biāo)“foo.a(dir/file.o)”時,可能會執(zhí)行如下的命令:



ar r foo.a dir/file.o



和上邊的例子類似,它是將指定目錄下的.o文件納入到庫文件中,作為靜態(tài)庫的一個成員。Makefile中出現(xiàn)類似的目標(biāo)時,隱含規(guī)則的命令行中可能就需要使用自動化變量“%D”和“%F”。

11.2.1 更新靜態(tài)庫的符號索引表
本小節(jié)的內(nèi)容相對簡單。前邊提到過,靜態(tài)庫文件可以使用工具“ar”來創(chuàng)建、維護(hù)。當(dāng)需要給靜態(tài)庫增建一個成員時(加入一個.o文件到靜態(tài)庫中), “ar”可以直接需要增加的.o文件拷貝到靜態(tài)庫中。這樣直接拷貝可能存在一個問題。在使用這個庫進(jìn)行連接生成可執(zhí)行文件時。“ld”卻提示了錯誤,可能 是:主程序使用了之前加入到庫中的.o文件中定義的一個函數(shù)(全局變量),但連接程序卻告訴你無法找到這個函數(shù)(或者變量)。

這個問題的原因就是:之前我們將編譯完成的.o文件加入到庫中,但是并沒有更新庫的符號表。連接程序進(jìn)行連接時,在靜態(tài)庫的符號索引表中無法定位剛才加入 的.o文件中定義的函數(shù)或者變量。如果需要讓加入的所有.o文件中定義的函數(shù)(變量)有效,需要使用另外一個工具“ranlib”來對靜態(tài)庫的符號索引表 進(jìn)行更新。

我們所使用到的靜態(tài)庫(文檔文件)中,存在這樣一個特殊的成員,它的名字是“__.SYMDEF”。它包含了靜態(tài)庫中所有成員所定義的有效符號(函數(shù)名、 變量名)。因此,當(dāng)為庫增加了一個成員時,相應(yīng)的就需要更新成員“__.SYMDEF”,否則所增加的成員中定義的所有的符號將無法被連接程序定位。完成 更新的命令是:



ranlib ARCHIVEFILE



通常在Makefile中我們可以這樣來實現(xiàn):



libfoo.a: libfoo.a(x.o) libfoo.a(y.o) ...

ranlib libfoo.a



它所實現(xiàn)的是:更新靜態(tài)庫成員“x.o”和“y.o”之后,同時對靜態(tài)庫的成員“__.SYMDEF”進(jìn)行更新(更新庫的符號索引表)。

如果我們使用GNU ar工具來維護(hù)、管理靜態(tài)庫,我們就不需要考慮這一步。GNU ar本身已經(jīng)提供了在創(chuàng)建庫時同時更新符號索引表的功能(這是默認(rèn)行為,我們也可以通過某些命令行選項來控制。大家可以參考 GNU ar工具的man手冊)。

11.3 make靜態(tài)庫的注意事項
在make靜態(tài)庫(文檔文件)時,特別需要注意的一點是:make的并行執(zhí)行(執(zhí)行make時使用“-j”選項)可能會給更新靜態(tài)庫所有影響。因為,在同一時刻,當(dāng)多個“ar”命令同時維護(hù)相同的靜態(tài)庫時,會造成靜態(tài)庫的損壞,甚至導(dǎo)致此靜態(tài)庫不可用。

可能在后期的make版本中,會提供一種在并行執(zhí)行時防止同時多個“ar”命令對同一靜態(tài)庫的操作的機制。但是就目前的版本來說,這個問題是存在的。因此 要求我們在書寫Makefile時,加入控制策略,來避免make并發(fā)執(zhí)行時多個“ar”命令同時操作同一個靜態(tài)庫文件?;蛘卟皇褂胢ake并發(fā)執(zhí)行功 能。

11.4 靜態(tài)庫的后綴規(guī)則
靜態(tài)庫的后綴規(guī)則屬于后綴規(guī)則的特殊應(yīng)用,后綴規(guī)則在目前版本的GNU make中已經(jīng)使用模式規(guī)則替代。但目前版本make同樣支持舊風(fēng)格的后綴規(guī)則,主要是為了兼容老版本的make。對于靜態(tài)庫也可以使用它的后綴規(guī)則。目 標(biāo)后綴需要是“.a”(在Linux(Unix)中、靜態(tài)庫的后綴為.a)。例如這樣一個后綴規(guī)則:

.c.a:

$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o

$(AR) r $@ $*.o

$(RM) $*.o



它相當(dāng)于模式規(guī)則:



(%.o): %.c

$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o

$(AR) r $@ $*.o

$(RM) $*.o



對于老風(fēng)格的后綴規(guī)則,它的目標(biāo)是“.a.c”,當(dāng)轉(zhuǎn)換為模式規(guī)則時。后綴規(guī)則中的“.a”被作為模式規(guī)則的目標(biāo)文件的后綴(目標(biāo)文件就是N.a);“.c”被作為了模式規(guī)則依賴文件的后綴(依賴文件就是N.c)。

存在這樣一種情況:可能一個不是靜態(tài)庫的文件使用了后綴.a。那么make也會按照正常的方式靜態(tài)庫的后綴規(guī)則轉(zhuǎn)換成為一個模式規(guī)則。因此一個雙后綴規(guī)則 的目標(biāo)“.x.a”,make轉(zhuǎn)換時將會產(chǎn)生兩個模式規(guī)則:“(%.o): %.x” 和“%.a: %.x”。具體的轉(zhuǎn)換過程可參考 后綴規(guī)則 一節(jié)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多