freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

make、編譯選項、連接問題(編輯修改稿)

2025-07-04 13:35 本頁面
 

【文章內(nèi)容簡介】 ’.’開始。 一個規(guī)則多個目標一條有多個目標的規(guī)則和寫多條規(guī)則,每條一個目標作用是等同的。同樣的命令應(yīng)用于所有目標,但其效用會因?qū)嶋H目標以’$@’代替而不同。規(guī)則中所有目標的依賴關(guān)系是一樣的。這在兩種情況下有用:★只有依賴關(guān)系,不需要命令。例如: : ★ 所有的目標同樣的命令。命令不需要完全相同,因為在命令中可以使用’$@’:bigoutput littleoutput : generate $(subst output,$@) $@和bigoutput : generate big bigoutputlittleoutput : generate little littleoutput等同。這里假設(shè)程序’generate’產(chǎn)生兩種輸出:一種使用’big’選項,一種使用’little’選項。如果想象使用’$@’變化命令那樣來變化依賴關(guān)系,不能通過多目標的普通規(guī)則實現(xiàn),但是可以通過模式規(guī)則來實現(xiàn)。 一個目標多條規(guī)則一個文件可以是多條規(guī)則的目標,所有規(guī)則的依賴關(guān)系被合并。如果目標比任一個依賴文件舊,命令被執(zhí)行。一個文件只能有一組命令執(zhí)行。如果多個規(guī)則對于同一個文件都給出了命令,make使用最后一組并打印錯誤信息(特殊情況:如果文件名以’.’開始,并不打印錯誤信息,這一點是為了和其它make兼容)。沒有任何理由需要將makefile寫成這樣,這是make給出錯誤信息的理由。一條只有依賴關(guān)系的附加規(guī)則可以一次給出許多文件的附加依賴文件。例如’objects’變量表示系統(tǒng)中編譯器的所有輸出.,說明當’’更改時所有文件必須重做的簡單方法如下: objects = : : $(objects) : 不用改變實際目標文件生成的規(guī)則,這條規(guī)則可以在需要增刪附加的依賴關(guān)系時插入或提出。另一個訣竅是附加的依賴關(guān)系可以用變量表示,在make執(zhí)行時,可以給變量賦值:extradeps=$(objects) : $(extradeps)當命令`make extradeps=39。執(zhí)行時會認為’’是每個目標文件的依賴文件,但簡單的’make’命令不是這樣。 靜態(tài)模式規(guī)則靜態(tài)模式規(guī)則(static pattern rules)可以指定多個目標,并且使用目標名字來建議依賴文件的名字;比普通多目標規(guī)則更通用因為不需要依賴關(guān)系是相同的:依賴關(guān)系必須類似但不需要相同。 語法TARGETS ...: TARGETPATTERN: DEPPATTERNS ... COMMANDS ...TARGETS列表指出規(guī)則應(yīng)用的目標,可以包含通配符,于普通規(guī)則的目標相同。TARGETPATTERN和DEPPATTERNS來表明目標的依賴關(guān)系如何計算:匹配TARGETPATTERN的目標從名字中抽出一部分,叫做詞干(stem),詞干被替換到DEPPATTERNS來形成依賴文件名。每個模式通常包含一個’%’字符。當TARGETPATTERN匹配一個目標時,’%’字符可以匹配目標名中的任何部分;這部分即是詞干,模式的其余部分必須完全匹配。例如’’匹配’%.o’,’foo’是詞干;目標’’和’’并不匹配這個模式。目標的依賴文件名通過將DEPPATTERNS中的’%’替換為詞干形成:如果依賴模式為’%.c’,在替換詞干’foo’可以得到’’。依賴模式中不包含’%’也是合法的,此依賴文件對所有的目標均有效。如果需要在模式規(guī)則中使用’%’字符,必須在其前面加’\’字符,如果’%’前的’\’字符是有實際意義的,必須在其前面加’\’,其它的’\’不必如此處理。如’the\%weird\\%pattern\\’在有效的’%’前是’the%weird\’,其后是’pattern\\’。最后的’\\’保持原樣是因為其并不影響’%’字符。以下例子從相應(yīng)的’.c’文件編譯’’和’’:objects = $(objects): %.o: %.c $(CC) c $(CFLAGS) $ o $@每個目標必須匹配目標模式,對于不匹配的目標會給出警告。如果列表中只有部分文件匹配模式,可以使用filter函數(shù)移去不匹配的文件名:files = $(filter %.o,$(files)): %.o: %.c $(CC) c $(CFLAGS) $ o $@$(filter %.elc,$(files)): %.elc: %.el emacs f batchbytepile $例子中`$(filter %.o,$(files))39。 結(jié)果是` ’; `$(filter %.elc,$(files))39。 的結(jié)果是`39。以下例子說明’$*’的使用:bigoutput littleoutput : %output : generate $* $@命令`generate39。執(zhí)行時,’$*’擴展為詞干’big’或’little’。 靜態(tài)模式規(guī)則和隱式規(guī)則靜態(tài)模式規(guī)則和隱式規(guī)則在作為模式規(guī)則是具有很多共同點,都有目標模式和構(gòu)造依賴文件名的模式,不同之處在于make決定何時應(yīng)用規(guī)則的方法。隱式規(guī)則可應(yīng)用于匹配其模式的任何目標,但只限于沒有指定命令的目標,如果有多條可應(yīng)用的隱式規(guī)則,只有一條被使用,取決于規(guī)則的順序。反之,靜態(tài)模式規(guī)則適用于規(guī)則中明確目標列表,不適用于其它目標且總是適用于指定的每個目標。如果有兩條沖突的規(guī)則,且都有命令,這是一個錯誤。靜態(tài)模式規(guī)則比隱式規(guī)則優(yōu)越之處如下:★ 可為一些不能按句法分類,但可以顯式列出的文件重載隱式規(guī)則★ 不能判定目錄中的精確內(nèi)容,一些無關(guān)的文件可能導(dǎo)致make適用錯誤的隱式規(guī)則;最終結(jié)果可能依賴于隱式規(guī)則的次序。適用靜態(tài)模式規(guī)則時,這種不確定性是不存在的:規(guī)則適用于明確指定的目標。 雙冒號規(guī)則雙冒號規(guī)則(Doublecolon rules)的目標后是’::’而不是’:’,當一個目標出現(xiàn)在多條規(guī)則中時,其處理和普通規(guī)則的處理不同。當一個目標出現(xiàn)在多條規(guī)則中時,所有規(guī)則必須是相同類型的:都是普通的或者都是雙冒號的。如果是雙冒號,規(guī)則之間相互獨立;如果目標需要更新,則規(guī)則的命令被執(zhí)行;結(jié)果可能是沒有執(zhí)行,或者執(zhí)行了其中一些,或者所有的規(guī)則都執(zhí)行了。同一目標的雙冒號規(guī)則事實是完全孤立的,每條規(guī)則被被單獨處理,就象不同目標的規(guī)則一樣;規(guī)則按照在makefile中出現(xiàn)的次序被處理,此類規(guī)則真正有意義的是那些于命令執(zhí)行次序無關(guān)的。這種規(guī)則有時比較晦澀不是特別有用;它提供了一種機制:通過不同依賴文件的更新來對目標進行不同的處理,這種情形很罕見。每個這種規(guī)則應(yīng)當提供命令,如果沒有,適用的隱式規(guī)則將使用。 自動生成依賴關(guān)系在makefile中,許多規(guī)則都是一些目標文件依賴于一些頭文件。例如:’’ 通過’include’使用’’,這樣規(guī)則:: 告訴make在’’變化時更新’’。在程序比較大時,需要寫許多這樣的規(guī)則;而且當每次增刪’include’時,必須小心的更新makefile。許多現(xiàn)代的編譯器可以幫你寫這些規(guī)則,通常這是通過編譯器的’M’選項,例如命令:cc –M 輸出以下內(nèi)容: : 這樣就不必寫這些規(guī)則,有編譯器代勞了。注意這樣的依賴關(guān)系中提及’’,不會被隱式規(guī)則認為是中間文件,這意味這make在使用過它之后不會將其刪除。使用老的’make’程序時,習慣做法是使用’make depend’命令利用編譯器的功能產(chǎn)生依賴關(guān)系,該命令會產(chǎn)生一個’depend’文件包含所有自動產(chǎn)生的依賴關(guān)系,然后在makefile中使用’include’將其讀入。使用GNU的make時,重新生成makefile的功能使得這種做法變得過時:從不需要顯式請求更新依賴關(guān)系,因為它總是重新生成任何過時的makefile。自動依賴關(guān)系生成推薦的做法是對每個源文件做一個makefile。對每個源文件’’,有一個makefile ’’,其中列出了目標文件’’依賴的所有文件,這樣在源文件更新時,需要掃描來產(chǎn)生新的依賴關(guān)系。例子是一個從’’產(chǎn)生依賴關(guān)系文件’’的模式規(guī)則:%.d: %.c $(SHELL) ec 39。$(CC) M $(CPPFLAGS) $ \ | sed 39。\39。39。s/\($*\)\.o[ :]*/\1 $@/g39。\39。39。 $@39。e選項是當$(CC)命令失敗時(exit狀態(tài)非0),shell立刻退出。通常shell的返回值是管道中最后一條命令(sed)的返回值,這樣make不會注意到編譯器出錯。使用GNU的C編譯器時(gcc),可以用’MM’選項來代替’M’選項,這樣省略系統(tǒng)頭文件的依賴關(guān)系。’sed’命令的目的是將 : 轉(zhuǎn)換為 : 這樣使得每個’.d’文件依賴于’.o’文件相應(yīng)源文件和頭文件,make則可以在原文間或頭文件變化時更新依賴關(guān)系文件。如果定義了生成’.d’文件的規(guī)則,可以使用’include’指令來讀入所有的文件:sources = include $(sources:.c=.d)例中使用替換變量來將源文件列表’ ’轉(zhuǎn)換為依賴關(guān)系文件的列表。因為’.d’文件和其它文件一樣,不需要更多工作,make會在需要時重新生成它們。編寫命令規(guī)則的命令是由一一執(zhí)行的shell命令組成。除了以分號隔開寫在依賴關(guān)系后的命令,每個命令行必須以tab字符開始空行和注釋行可以出現(xiàn)在命令行中,處理時被忽略(注意:以tab字符開始的空行不是’空’行,是一條空命令)。可以在命令中使用任何程序,但這些程序是由$(SHELL)來執(zhí)行的。 回顯通常make打印出要執(zhí)行的命令,稱之為回顯,這和親自敲命令的現(xiàn)象是一樣的。當行之前有’@’字符時,命令不再回顯,字符’@’在傳遞給shell前丟棄。典型的用法是只對打印命令有效,比如’echo’命令:@echo About to make distribution files當make使用’n’或’—justprint’選項時,顯示要發(fā)生的一切,但不執(zhí)行命令。只有在這種情況下,即使命令以’@’開始,命令行仍然顯示出來。這個選項對查看make實際要執(zhí)行的動作很有用?!畇’或’—silent’選項阻止make所有回顯,就象所有命令以’@’開始一樣;一條沒有依賴關(guān)系的’.SILENT’規(guī)則有相同的作用,但是’@’更加靈活。 執(zhí)行在需要執(zhí)行命令更新目標時,make為每一行創(chuàng)建一個子shell來執(zhí)行。這意味著諸如為進程設(shè)置局部變量的shell命令’cd’(改變進程的當前目錄)不會影響以后的命令。如果需要’cd’影響下一個命令,將它們放在一行上用分號隔開,這樣make認為是一條命令傳遞給shell程序(注意:這需要shell支持):foo : bar/lose cd bar。 gobble lose ../foo另一個形式使用續(xù)行符:foo : bar/lose cd bar。 \ gobble lose ../fooshell程序的名字是通過’SHELL’變量來取得的。(*UNIX)不象大多數(shù)變量,’SHELL’變量不是通過環(huán)境來設(shè)置的(即需要在makefile中設(shè)置),因為’SHELL’環(huán)境是個人選擇的,如果不同人的選擇會影響makefile的功能的話,這樣很糟糕。 并行執(zhí)行GNU make可以一次執(zhí)行幾條命令。通常make一次執(zhí)行一條命令,等待其返回,再執(zhí)行下一條。使用’j’或’—jobs’可以同時執(zhí)行多條命令。如果’j’后梗一個正數(shù),表示一次可以執(zhí)行的命令條數(shù);如果’j’之后沒有參數(shù),則不限制可執(zhí)行的命令數(shù)。缺省的數(shù)量是一。一個討厭的問題是如果同時執(zhí)行多條命令,它們的輸出會混在一起;另一個問題是兩個進程不能從同一個設(shè)備獲得輸入。 錯誤每條shell命令返回時,make會檢查其返回狀態(tài)。如果命令執(zhí)行成功,則下一條命令被執(zhí)行,最后一條命令執(zhí)行完后,規(guī)則執(zhí)行結(jié)束。如果有錯誤(返回非0狀態(tài)),make放棄當前規(guī)則,也可能是所有規(guī)則。有時候命令執(zhí)行錯誤并不是問題,比如使用’mkdir’命令確保目錄存在:如果目錄一存在,則’mkdir’會報告錯誤,但仍希望make繼續(xù)。要忽略命令的錯誤,在命令之前使用’‘字符,’‘字符在傳遞給shell之前被丟棄:clean: rm f *.o如果使用’i’或’—ignoreerrors’選項,make會忽略所有命令產(chǎn)生的錯誤;一條沒有依賴關(guān)系的’.IGNORE’規(guī)則有相同的作用,但’‘更靈活。在忽略錯誤時,make將錯誤也認為是成功,只是通知你命令的退出狀態(tài)和和錯誤被忽略。如果make并未告知忽略錯誤,在錯誤發(fā)生時,表明該目標不能成功更新,直接或間接依賴于此的目標當然也不能成功;這些目標的命令不會被執(zhí)行,因為其先決條件不滿足。通常make會立即以非0狀態(tài)退出。然而,如果給定’k’或’—keepgoing’選項,make在退出前會處理其它的依賴關(guān)系,進行必要的更新。例如,在編譯一個目標文件遇到錯誤,’make k’會繼續(xù)編譯其它的目標文件。通常認為你的目的是更新指定的目標,當make知道這是不可能時,會立即報告失?。弧痥’選項指示真正目的是測試更新程序的更多可能性:在編譯之前找出更多不相關(guān)的問題。如果命令失敗了,假設(shè)它更新的目標文件,這個文件是不完整的不能使用-至少不是完全更新的。但文件的最后修改時間表明停已經(jīng)是最新的,下一次make運行時,不會再更新這個文件。這種情況和命令被kill相同;則通常情況下在命令失敗時將目標刪除是正確的;當’.DELETE_ON_ERROR’是目標時make幫你做這件事。雖然你總是希望make這么做,但這不是過去的習慣;所以必須顯式要求make這樣做(其它的make自動這樣做)。 中斷make如果make執(zhí)行命令時遇到錯誤,可能會刪除命令更新的目標文件: m
點擊復(fù)制文檔內(nèi)容
教學(xué)教案相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1