日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

56 FreeBSD連載:手工編譯安裝程序( 二 )


make
通常應用程序都比較復雜,那么其源程序就不僅包括一個文件,而是由多個文件構成,這樣應用程序的編譯和連接過程就相對復雜得多 。最簡單的情況下可以使用shell程序來自動完成這個任務,然而由于并不是每次都更改了所有的文件,每次都完全重新編譯所有的代碼,不但浪費了處理器資源,也使得每次作一次小改變就得編譯所有得文件,效率低下 。最好是能夠按照需要,編譯改動過的代碼文件,而對沒有更新過的文件就不必重新編譯,這樣就節(jié)約了系統(tǒng)的處理能力 。
如果要使用shell腳本來處理這些依賴關系來,則要求根據(jù)文件的更新時間進行維護,需要的shell腳本就比較復雜 。Unix提供了一個程序──make,來幫助按照代碼之間的時間依賴關系來進行維護工作 。
make與其他解釋語言不同,不是直接告訴make需要執(zhí)行的命令,而是給定一些依賴規(guī)則,即在什么條件下應該執(zhí)行什么處理,那么make就自動分析文件的更新時間,完成剩下的工作 。規(guī)定make規(guī)則的文件一般命名為Makefile,這是一個make指令的集合,這個文件中包括目標定義、執(zhí)行命令、宏定義和make偽指令 。下面為一個簡單的Makefile:
CC = /usr/local/bin/egcchello: hello.c$(CC) -o hello hello.cclean:echo delete files!rm hello這個例子中首先定義了一個宏CC,然后定義一個執(zhí)行目標hello,這個目標依賴于hello.c文件,一旦hello.c更新,就需要執(zhí)行下面的編譯指令 。注意,位于定義目標之后的執(zhí)行命令應該使用一個 “Tab” 制表符引導,而不是其他空白字符 。執(zhí)行命令中首先將宏替換為它的值,再執(zhí)行egcc命令編譯程序 。
一個Makefile文件中可以定義多個目標,如上面例子中的hello和clean,如果不使用任何命令行參數(shù)來啟動make,那么缺省使用第一個目標 。為了應用其他的make目標,則必須使用make的命令行參數(shù) 。
$ make cleandelete files!make使用的缺省文件名為當前目錄下的makefile或Makefile,如果使用其他文件,必須使用命令行參數(shù)-f指定文件名 。
$ make -f newmakefileGNU的make命令首先查看的文件名為GNUmakefile 。
使用了make,對大型的應用軟件進行維護就會容易一些 。然而不同的系統(tǒng)有一些與系統(tǒng)相關的定義,這些定義需要在Makefile中依據(jù)不同的系統(tǒng)重新設置,例如X Window的目錄等,這樣要完成可以適合多個不同系統(tǒng)的Makefile文件,仍然具有困難 。有一些工具能幫助進行這些系統(tǒng)相關的設置,并生成Makefile文件,例如X Window系統(tǒng)使用xmkmf命令和imake模板文件來產生本地的Makefile文件,這樣就能正確偵知本地系統(tǒng)中有關X Window的正確設置,但軟件開發(fā)者首先要完成Imakefile文件,以使用xmkmf 。而GNU的軟件使用autoconf工具,它使用configure命令用來偵測很多系統(tǒng)相關的設置,如編譯器、頭文件、庫函數(shù)等等,然后使用預設置的Makefile.in模板文件來產生相應的Makefile 。有了這些工具,進行編譯各種多平臺的應用程序都不再是困難的了 。
未完,待續(xù) 。。。

推薦閱讀