欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

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

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

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

11.1 庫成員作為目標
一個(gè)靜態(tài)庫通常由多個(gè)成員(.o文件)組成。靜態(tài)庫文件的成員可獨立被作為一個(gè)規則的目標,將庫成員作為目標時(shí)需要按照如下的格式來(lái)書(shū)寫(xiě):



ARCHIVE(MEMBER)



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



foolib(hack.o) : hack.o

ar cr foolib hack.o



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

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



foolib(hack.o kludge.o)



它就等價(jià)于:



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



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

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

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

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



cc -c bar.c -o bar.o

ar r foo.a bar.o

rm -f bar.o



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

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



ar r foo.a dir/file.o



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

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

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

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



ranlib ARCHIVEFILE



通常在Makefile中我們可以這樣來(lái)實(shí)現:



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

ranlib libfoo.a



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

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

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

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

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

.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



對于老風(fēng)格的后綴規則,它的目標是“.a.c”,當轉換為模式規則時(shí)。后綴規則中的“.a”被作為模式規則的目標文件的后綴(目標文件就是N.a);“.c”被作為了模式規則依賴(lài)文件的后綴(依賴(lài)文件就是N.c)。

存在這樣一種情況:可能一個(gè)不是靜態(tài)庫的文件使用了后綴.a。那么make也會(huì )按照正常的方式靜態(tài)庫的后綴規則轉換成為一個(gè)模式規則。因此一個(gè)雙后綴規則 的目標“.x.a”,make轉換時(shí)將會(huì )產(chǎn)生兩個(gè)模式規則:“(%.o): %.x” 和“%.a: %.x”。具體的轉換過(guò)程可參考 后綴規則 一節
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
第十一章 : 更新靜態(tài)庫
跟我一起寫(xiě)Makefile 10——使用make更新函數庫文件
Makefile詳解(三)
特殊目標(GNU 制作)
Linux環(huán)境下程序編譯
android makefile(android.mk)分析
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久