• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            函數(shù)庫(kù)文件也就是對(duì)Object文件(程序編譯的中間文件)的打包文件。在Unix下,一般是由命令"ar"來完成打包工作。

            一、函數(shù)庫(kù)文件的成員

            一個(gè)函數(shù)庫(kù)文件由多個(gè)文件組成。你可以以如下格式指定函數(shù)庫(kù)文件及其組成:

                archive(member)

            這個(gè)不是一個(gè)命令,而一個(gè)目標(biāo)和依賴的定義。一般來說,這種用法基本上就是為了"ar"命令來服務(wù)的。如:

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

            如果要指定多個(gè)member,那就以空格分開,如:

                foolib(hack.o kludge.o)

            其等價(jià)于:

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

            你還可以使用Shell的文件通配符來定義,如:

                foolib(*.o)


            二、函數(shù)庫(kù)成員的隱含規(guī)則

            當(dāng)make搜索一個(gè)目標(biāo)的隱含規(guī)則時(shí),一個(gè)特殊的特性是,如果這個(gè)目標(biāo)是"a(m)"形式的,其會(huì)把目標(biāo)變成"(m)"。于是,如果我們的成員是"%.o"的模式定義,并且如果我們使用"make foo.a(bar.o)"的形式調(diào)用Makefile時(shí),隱含規(guī)則會(huì)去找"bar.o"的規(guī)則,如果沒有定義bar.o的規(guī)則,那么內(nèi)建隱含規(guī)則生效,make會(huì)去找bar.c文件來生成bar.o,如果找得到的話,make執(zhí)行的命令大致如下:

                cc -c bar.c -o bar.o
                ar r foo.a bar.o
                rm -f bar.o

            還有一個(gè)變量要注意的是"$%",這是專屬函數(shù)庫(kù)文件的自動(dòng)化變量,有關(guān)其說明請(qǐng)參見"自動(dòng)化變量"一節(jié)。


            三、函數(shù)庫(kù)文件的后綴規(guī)則

            你可以使用"后綴規(guī)則"和"隱含規(guī)則"來生成函數(shù)庫(kù)打包文件,如:

                .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


            四、注意事項(xiàng)

            在進(jìn)行函數(shù)庫(kù)打包文件生成時(shí),請(qǐng)小心使用make的并行機(jī)制("-j"參數(shù))。如果多個(gè)ar命令在同一時(shí)間運(yùn)行在同一個(gè)函數(shù)庫(kù)打包文件上,就很有可以損壞這個(gè)函數(shù)庫(kù)文件。所以,在make未來的版本中,應(yīng)該提供一種機(jī)制來避免并行操作發(fā)生在函數(shù)打包文件上。

            但就目前而言,你還是應(yīng)該不要盡量不要使用"-j"參數(shù)。

             

            后序
            ——

            終于到寫結(jié)束語的時(shí)候了,以上基本上就是GNU make的Makefile的所有細(xì)節(jié)了。其它的產(chǎn)商的make基本上也就是這樣的,無論什么樣的make,都是以文件的依賴性為基礎(chǔ)的,其基本是都是遵循一個(gè)標(biāo)準(zhǔn)的。這篇文檔中80%的技術(shù)細(xì)節(jié)都適用于任何的make,我猜測(cè)"函數(shù)"那一章的內(nèi)容可能不是其它make所支持的,而隱含規(guī)則方面,我想不同的make會(huì)有不同的實(shí)現(xiàn),我沒有精力來查看GNU的make和VC的nmake、BCB的make,或是別的UNIX下的make有些什么樣的差別,一是時(shí)間精力不夠,二是因?yàn)槲一旧隙际窃赨nix下使用make,以前在SCO Unix和IBM的AIX,現(xiàn)在在Linux、Solaris、HP-UX、AIX和Alpha下使用,Linux和Solaris下更多一點(diǎn)。不過,我可以肯定的是,在Unix下的make,無論是哪種平臺(tái),幾乎都使用了Richard Stallman開發(fā)的make和cc/gcc的編譯器,而且,基本上都是GNU的make(公司里所有的UNIX機(jī)器上都被裝上了GNU的東西,所以,使用GNU的程序也就多了一些)。GNU的東西還是很不錯(cuò)的,特別是使用得深了以后,越來越覺得GNU的軟件的強(qiáng)大,也越來越覺得GNU的在操作系統(tǒng)中(主要是Unix,甚至Windows)"殺傷力"。

            對(duì)于上述所有的make的細(xì)節(jié),我們不但可以利用make這個(gè)工具來編譯我們的程序,還可以利用make來完成其它的工作,因?yàn)橐?guī)則中的命令可以是任何Shell之下的命令,所以,在Unix下,你不一定只是使用程序語言的編譯器,你還可以在Makefile中書寫其它的命令,如:tar、awk、mail、sed、cvs、compress、ls、rm、yacc、rpm、ftp……等等,等等,來完成諸如"程序打包"、"程序備份"、"制作程序安裝包"、"提交代碼"、"使用程序模板"、"合并文件"等等五花八門的功能,文件操作,文件管理,編程開發(fā)設(shè)計(jì),或是其它一些異想天開的東西。比如,以前在書寫銀行交易程序時(shí),由于銀行的交易程序基本一樣,就見到有人書寫了一些交易的通用程序模板,在該模板中把一些網(wǎng)絡(luò)通訊、數(shù)據(jù)庫(kù)操作的、業(yè)務(wù)操作共性的東西寫在一個(gè)文件中,在這些文件中用些諸如"@@@N、###N"奇怪字串標(biāo)注一些位置,然后書寫交易時(shí),只需按照一種特定的規(guī)則書寫特定的處理,最后在make時(shí),使用awk和sed,把模板中的"@@@N、###N"等字串替代成特定的程序,形成C文件,然后再編譯。這個(gè)動(dòng)作很像數(shù)據(jù)庫(kù)的"擴(kuò)展C"語言(即在C語言中用"EXEC SQL"的樣子執(zhí)行SQL語句,在用cc/gcc編譯之前,需要使用"擴(kuò)展C"的翻譯程序,如cpre,把其翻譯成標(biāo)準(zhǔn)C)。如果你在使用make時(shí)有一些更為絕妙的方法,請(qǐng)記得告訴我啊。

            回頭看看整篇文檔,不覺記起幾年前剛剛開始在Unix下做開發(fā)的時(shí)候,有人問我會(huì)不會(huì)寫Makefile時(shí),我兩眼發(fā)直,根本不知道在說什么。一開始看到別人在vi中寫完程序后輸入"!make"時(shí),還以為是vi的功能,后來才知道有一個(gè)Makefile在作怪,于是上網(wǎng)查啊查,那時(shí)又不愿意看英文,發(fā)現(xiàn)就根本沒有中文的文檔介紹Makefile,只得看別人寫的Makefile,自己瞎碰瞎搞才積累了一點(diǎn)知識(shí),但在很多地方完全是知其然不知所以然。后來開始從事UNIX下產(chǎn)品軟件的開發(fā),看到一個(gè)400人年,近200萬行代碼的大工程,發(fā)現(xiàn)要編譯這樣一個(gè)龐然大物,如果沒有Makefile,那會(huì)是多么恐怖的一樣事啊。于是橫下心來,狠命地讀了一堆英文文檔,才覺得對(duì)其掌握了。但發(fā)現(xiàn)目前網(wǎng)上對(duì)Makefile介紹的文章還是少得那么的可憐,所以想寫這樣一篇文章,共享給大家,希望能對(duì)各位有所幫助。

            現(xiàn)在我終于寫完了,看了看文件的創(chuàng)建時(shí)間,這篇技術(shù)文檔也寫了兩個(gè)多月了。發(fā)現(xiàn),自己知道是一回事,要寫下來,跟別人講述又是另外一回事,而且,現(xiàn)在越來越?jīng)]有時(shí)間專研技術(shù)細(xì)節(jié),所以在寫作時(shí),發(fā)現(xiàn)在闡述一些細(xì)節(jié)問題時(shí)很難做到嚴(yán)謹(jǐn)和精練,而且對(duì)先講什么后講什么不是很清楚,所以,還是參考了一些國(guó)外站點(diǎn)上的資料和題綱,以及一些技術(shù)書籍的語言風(fēng)格,才得以完成。整篇文檔的提綱是基于GNU的Makefile技術(shù)手冊(cè)的提綱來書寫的,并結(jié)合了自己的工作經(jīng)驗(yàn),以及自己的學(xué)習(xí)歷程。因?yàn)閺膩頉]有寫過這么長(zhǎng),這么細(xì)的文檔,所以一定會(huì)有很多地方存在表達(dá)問題,語言歧義或是錯(cuò)誤。因些,我迫切地得等待各位給我指證和建議,以及任何的反饋。

            最后,還是利用這個(gè)后序,介紹一下自己。我目前從事于所有Unix平臺(tái)下的軟件研發(fā),主要是做分布式計(jì)算/網(wǎng)格計(jì)算方面的系統(tǒng)產(chǎn)品軟件,并且我對(duì)于下一代的計(jì)算機(jī)革命——網(wǎng)格計(jì)算非常地感興趣,對(duì)于分布式計(jì)算、P2P、Web Service、J2EE技術(shù)方向也很感興趣,同時(shí),對(duì)于項(xiàng)目實(shí)施、團(tuán)隊(duì)管理、項(xiàng)目管理也小有心得,希望同樣和我戰(zhàn)斗在“技術(shù)和管理并重”的陣線上的年輕一代,能夠和我多多地交流。我的MSN是:haoel@hotmail.com(常用),QQ是:753640(不常用)。(注:請(qǐng)勿給我MSN的郵箱發(fā)信,由于hotmail的垃圾郵件導(dǎo)致我拒收這個(gè)郵箱的所有來信)

            我歡迎任何形式的交流,無論是討論技術(shù)還是管理,或是其它海闊天空的東西。除了政治和娛樂新聞我不關(guān)心,其它只要積極向上的東西我都?xì)g迎!

            最最后,我還想介紹一下make程序的設(shè)計(jì)開發(fā)者。

             

            首當(dāng)其沖的是: Richard Stallman  

            開源軟件的領(lǐng)袖和先驅(qū),從來沒有領(lǐng)過一天工資,從來沒有使用過Windows操作系統(tǒng)。對(duì)于他的事跡和他的軟件以及他的思想,我無需說過多的話,相信大家對(duì)這個(gè)人并不比我陌生,這是他的主頁:http://www.stallman.org/ 。這里只貼上一張他的近照:







             gunguymadman 回復(fù)于:2004-09-16 12:27:15

            第二位是:Roland McGrath  

            個(gè)人主頁是:http://www.frob.com/~roland/ ,下面是他的一些事跡:

            1)  合作編寫了并維護(hù)GNU make。

            2)  和Thomas Bushnell一同編寫了GNU Hurd。

            3)  編寫并維護(hù)著GNU C library。 

            4)  合作編寫并維護(hù)著部分的GNU Emacs。 

             

            在此,向這兩位開源項(xiàng)目的斗士致以最真切的敬意。


            (全文完)

            久久久久亚洲AV成人网| 久久久久久久精品成人热色戒| 久久精品国产69国产精品亚洲| 久久国产精品二国产精品| 狠狠88综合久久久久综合网| 香蕉久久夜色精品国产2020| 国内精品久久久久久久久电影网| 久久精品国产亚洲av高清漫画| 亚洲中文字幕无码久久2020| 成人久久免费网站| 中文字幕人妻色偷偷久久| 麻豆一区二区99久久久久| 99久久成人18免费网站| 国内精品久久久久久不卡影院| 精品国产乱码久久久久久浪潮| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 亚洲国产精品久久久天堂 | 狠狠色丁香久久婷婷综合五月| 久久天堂AV综合合色蜜桃网| 国产精品美女久久久久| 2021久久精品国产99国产精品| 四虎国产永久免费久久| 久久精品国产一区二区| 一本久久综合亚洲鲁鲁五月天| 久久亚洲日韩看片无码| 人妻少妇久久中文字幕一区二区| 久久国产高潮流白浆免费观看| 久久国产精品99久久久久久老狼 | 久久精品极品盛宴观看| 波多野结衣AV无码久久一区| 国产精品免费福利久久| 久久综合伊人77777麻豆| 一本色道久久综合狠狠躁| 嫩草影院久久国产精品| 久久乐国产综合亚洲精品| 国产精品久久精品| 亚洲欧美久久久久9999| 青草影院天堂男人久久| 亚洲午夜福利精品久久| 久久国产乱子伦精品免费强| 欧美精品国产综合久久|