gcc自動生成依賴文件_第1頁
gcc自動生成依賴文件_第2頁
gcc自動生成依賴文件_第3頁
全文預覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

那么,編譯器的這個功能如何與我們的Makefile聯(lián)系在一起呢。因為這樣一來,我們的Makefile也要根據(jù)這些源文件重新生成,讓Makefile自已依賴于源文件?這個功能并不現(xiàn)實,不過我們可以有其它手段來迂回地實現(xiàn)這一功能。GNU組織建議把編譯器為每一個源文件的自動生成的依賴關(guān)系放到一個文件中,為每一個 “name.d”文件都生成一個 “name.d"的Makefile文件,[.d]文件中就存放對應[.c]文件的依賴關(guān)系。 于是,我們可以寫出[.c]文件和[.d]文件的依賴關(guān)系,并讓make自動更新或自成[.d]文件,并把其包含在我們的主Makefile中,這樣,我們就可以自動化地生成每個文件的依賴關(guān)系了。%.d:%.c@set-e;rm-f$@;\$(CC)-M$(CPPFLAGS)$<>$@.$$$$;\sed's,\($*\)\.o[:]*,\1.o$@:,g'<$@.$$$$>$@;\rm-f$@.$$$$執(zhí)行:make文件名.d解釋如下:第一行不用多說;第二行:@set-e;rm-f$@;\@set-e;\\@表示makefile執(zhí)行這條命令時不顯示出來,\\set-e;表示此腳本在執(zhí)行時返回非零的值 ,此腳本將終止運行,查找?guī)椭募缦?每當命令運行完后,make會檢測每個命令的返回碼,如果命令返回成功,那么make會執(zhí)行下一條命令,當規(guī)則中所有的命令成功返回后,這個規(guī)則就算是成功完成了。如果一個規(guī)則中的某個命令出錯了(命令退出碼非零),那么make就會終止執(zhí)行當前規(guī)則,這將有可能終止所有規(guī)則的執(zhí)行。如果想忽略錯誤,可以在命令行前加一個減號“-”。例:clean:-rm-*.o還有一個全局的辦法是,給 make加上-'i'或是--ignore-errors參數(shù),那么,Makefile中所有命令都會忽略錯誤。而如果一個規(guī)則是以 “.IGNORE作為目標的,那么這個規(guī)則中的所有命令將會忽略錯誤。這些是不同級別的防止命令出錯的方法,你可以根據(jù)你的不同喜歡設置。還有一個要提一下的make的參數(shù)的是-k"或是--keep-going",這個參數(shù)的意思是,如果某規(guī)則中的命令出錯了,那么就終目該規(guī)則的執(zhí)行,但繼續(xù)執(zhí)行其它規(guī)則。ricky@ubuntu:~$helpset-eExitimmediatelyifacommandexitswithanon-zerostatus.(Using+ratherthan-causestheseflagstobeturnedoff.\\)rm-f$@;刪除生成的目標文件(即*.d)第三行:$(CC)-M$(CPPFLAGS)$<>$@.$$$$;\$(CC)-M$(CPPFLAGS)$<$<依賴的目標集(即*.c),-M:表示生成文件依賴關(guān)系,>$@.$$$$>重定向輸出,$@:表示生成的目標文件(即*.d),$$:表示本身的ProcessID總的意思就是:將a.c文件生成的依賴關(guān)系報存在a.d.1212文件中.(假設a.c為文件名,12為ProcessID).備注:編譯依賴文件,并把它的名字根據(jù)進程號命名成一個臨時文件,用進程號命名是一個技巧,這樣重名的可能性很小 ?第四行:sed's,\($*\)\.o[:]*,\1.o$@:,g'<$@.$$$$>$@;\這一行用到了sed編輯器,sd是streameditor的縮寫,流編輯器的意思?它可以對來自文件或者標準輸入的輸入流進行變換,它常被用作管道中的過濾器 ?詳細可以查看幫助文檔?sed命令的結(jié)構(gòu)是s,match,replace,g,其中s后面的,號就是常見的,一般寫成的形式,但也可以把替換成其他符號,比如這里是逗號。g是全局的意思,具體你查查sed。match和replace都是正則表達式。 match部分,要先解析makefile的元字符,$*和$@,這個你查查makefile。\(\)是為了后面的引用,后面的\1就是引用這里\(和\)之間括起的部分模式。[:]也很好理解,你查查正則表達式的文檔。s,match,replace,g對應s,\($*\)\.o[:]*,\1.o$@:,g分別對應如下:s=smatch=\($*\)\.o[:]* \\需要熟悉正則表達式replace=\1.o$@: \\需要熟悉正則表達式g=g即第四行可以寫為:sedsed_cmd<$@.$$$$>$@;<$@.$$$$表示sed處理的數(shù)據(jù)為$@.$$$$文件內(nèi)容,就是上面生成的臨時文件(a.d.1212),>$@表示將sed處理后的內(nèi)容重定向到$@(a.12)文件中.總得意思就是:將a.d.1212文件中的內(nèi)容經(jīng)過sed命令的處理,輸出到a.d文件中備注:用<來改變讀進的數(shù)據(jù)信道(stdin),使之從指定的檔案讀進;用>來改變送出的數(shù)據(jù)信道(stdout,stderr),使之輸出到指定的檔案;整句話的意思是把臨時文件做一個修改然后寫入目標文件。 這個修改是這樣的,臨時文件的第一行是a.o:a.c...修改后是a.oa.d:a.c...第5行rm-f$@.$$$$刪除臨時文件(a.d.1212)綜上所述:(假設針對的是文件a.c)%.d:%.cII所有的.d文件依賴于.c文件@set-e;rm-f$@;III刪除前期生成的目標文件(a.d)$(CC)-M$(CPPFLAGS)$<>$@.$$$$;III將編譯器針對源文件(a.o)生成的依賴關(guān)系保存到臨時文件(a.121

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論