<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    DANCE WITH JAVA

    開發出高質量的系統

    常用鏈接

    統計

    積分與排名

    好友之家

    最新評論

    (轉)跟我一起學make十四

    使用make更新函數庫文件
    ———————————

    函數庫文件也就是對Object文件(程序編譯的中間文件)的打包文件。在Unix下,一般是由命令"ar"來完成打包工作。

    一、函數庫文件的成員

    一個函數庫文件由多個文件組成。你可以以如下格式指定函數庫文件及其組成:

    ??? archive(member)

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

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

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

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

    其等價于:

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

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

    ??? foolib(*.o)


    二、函數庫成員的隱含規則

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

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

    還有一個變量要注意的是"$%",這是專屬函數庫文件的自動化變量,有關其說明請參見"自動化變量"一節。


    三、函數庫文件的后綴規則

    你可以使用"后綴規則"和"隱含規則"來生成函數庫打包文件,如:

    ??? .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


    四、注意事項

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

    但就目前而言,你還是應該不要盡量不要使用"-j"參數。

    ?

    后序
    ——

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

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

    ?

    posted on 2006-09-23 00:38 dreamstone 閱讀(458) 評論(0)  編輯  收藏 所屬分類: 利器

    主站蜘蛛池模板: 国产成人AV免费观看| 亚洲AV无码不卡在线观看下载| 又爽又黄无遮挡高清免费视频| 亚洲AV永久青草无码精品| 麻豆va在线精品免费播放 | 全亚洲最新黄色特级网站| 亚洲同性男gay网站在线观看| 久久久久久国产a免费观看不卡| 国产伦精品一区二区三区免费下载| 国产成人精品日本亚洲专区6| 91香蕉国产线观看免费全集| 在线A亚洲老鸭窝天堂| 一级毛片免费播放男男| 亚洲不卡AV影片在线播放| 一区二区三区在线免费看| 亚洲国产精品免费视频| a级毛片免费全部播放| 久久亚洲国产伦理| 91久久成人免费| 亚洲精品乱码久久久久久下载| 麻豆视频免费观看| 久久久久久国产a免费观看不卡| 亚洲人成无码网站在线观看| 日本高清免费不卡在线| 美女的胸又黄又www网站免费| 亚洲成人福利在线| 日本免费一区二区三区最新| 无码AV片在线观看免费| 羞羞视频在线观看免费| 亚洲人成在线影院| 国产亚洲?V无码?V男人的天堂| 国产线视频精品免费观看视频| 亚洲五月六月丁香激情| 亚洲精品无码你懂的网站| 99在线观看免费视频| 亚洲精品中文字幕无码A片老| 亚洲精品成人av在线| 亚洲国产精品高清久久久| 亚洲免费观看在线视频| 国产成人无码区免费内射一片色欲 | 国产乱弄免费视频|