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

正文內(nèi)容

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

2025-06-19 13:35 本頁面
 

【正文】 cxMake使用問題、Gcc編譯選項問題、GNU 連接問題一、 GNU Make使用make工作自動確定工程的哪部分需要重新編譯,執(zhí)行命令去編譯它們。雖然make多用于C程序,然而只要提供命令行的編譯器,你可以將其用于任何語言。如果要使用make,你必須寫一個叫做“makefile”的文件,這個文件描述工程中文件之間的關(guān)系,提供更新每個文件的命令。典型的工程是這樣的:可執(zhí)行文件靠目標文件來更新,目標文件靠編譯源文件來更新。Makefile寫好之后,每次更改了源文件后,只要執(zhí)行make就足夠了,所有必要的重新編譯將執(zhí)行。Make程序利用makefile中的數(shù)據(jù)庫和文件的最后修改時間來確定那個文件需要更新;對于需要更新的文件,make執(zhí)行數(shù)據(jù)庫中記錄的命令??梢蕴峁┟钚袇?shù)給make來控制那個文件需要重新編譯。 Makefile介紹Makefile文件告訴make做什么,多數(shù)情況是怎樣編譯和鏈接一個程序。這里有一個簡單的makefile,描述如何編譯鏈接由8個C文件和3個頭文件組成的一個編輯器:edit : \ cc –o edit \ : cc –c : cc –c : cc c : cc c : cc c : cc c : cc c : cc c clean : rm edit \ 將長行用\分開便于閱讀,這和使用一個長行的作用是一樣的。使用這個makefile創(chuàng)建可執(zhí)行文件“edit”時運行make就可以了;如果要將可執(zhí)行文件和目標文件刪除,執(zhí)行make cleanmake重新編譯這個編輯器時,每個更改的C文件必須重新編譯;如果頭文件更改了,每個包含頭文件的C文件必須重新編譯;每次編譯產(chǎn)生一個對應(yīng)于原文件的目標文件。最終,目標文件鏈接在一起產(chǎn)生新的可執(zhí)行文件。 規(guī)則簡介makefile中的規(guī)則是這樣的:TARGET … : DEPENDENCIES … COMMAND …目標(TARGET)程序產(chǎn)生的文件,如可執(zhí)行文件和目標文件;目標也可以是要執(zhí)行的動作,如“clean”。依賴(DEPENDENCIES)是用來產(chǎn)生目標的輸入文件,一個目標通常依賴于多個文件。命令(COMMAND)是make執(zhí)行的動作,一個可以有多個命令,每個占一行。注意:每個命令行的起始字符必須為TAB字符!有依賴關(guān)系規(guī)則中的命令通常在依賴文件變化時負責(zé)產(chǎn)生target文件,make執(zhí)行這些命令更新或產(chǎn)生target。規(guī)則可以沒有依賴關(guān)系,如包含target “clean”的規(guī)則。規(guī)則解釋如何和何時重做該規(guī)則中的文件,make根據(jù)依賴關(guān)系執(zhí)行產(chǎn)生或更新目標;規(guī)則也說明如何和何時執(zhí)行動作。有的規(guī)則看起來很復(fù)雜,但都符合上述模式。 make工作原理缺省make從第一個target開始(第一個非 ’.’ 開始的target),這稱作缺省目標。在上述的makefile中,缺省目標是更新執(zhí)行程序’edit’,將這個目標置于最前面。當(dāng)執(zhí)行make的時候,make程序從當(dāng)前目錄讀入makefile開始處理第一個規(guī)則;在例子中,這個規(guī)則是重新鏈接’edit’;在make處理這個規(guī)則之前,必須處理’edit’所依賴的那些文件的規(guī)則,例子中是目標文件。這些文件按照他們自己的規(guī)則處理:通過編譯源文件來更新每個’.o’文件;當(dāng)依賴關(guān)系中的源文件或頭文件比目標文件新,或目標文件不存在時,必須重新編譯。其它的規(guī)則被處理是因為他們的target是目標的依賴,和目標沒有依賴關(guān)系的規(guī)則不會被處理,除非指定make處理(如make clean)。在重新編譯目標文件之前,make會試圖更新它的依賴:源文件和頭文件。例子中的makefile對源文件和頭文件未指定任何操作:’.c’和’.h’文件不是任何規(guī)則的目標。確認所有的目標文件都是最新的之后,make決定是否重新鏈接’edit’:如果’edit’不存在,或者任何一個目標文件都比它新,則鏈接工作將進行。這樣,make會編譯這個文件來更新’’,然后鏈接’edit’;如果修改了’’運行make,’’,’’,’’會重新生成,鏈接’edit’。 使用變量在例子中,在規(guī)則’edit’中,目標文件被列出來兩次:edit : \ cc o edit \ 這樣的重復(fù)容易出錯:假設(shè)工程中加入了一個新的目標文件,可能只將其加入了一個列表中;通過使用變量可以消除這種風(fēng)險:變量允許一個預(yù)定義的字符串在多個地方被替換。在makefile中,可以寫這樣一行來定義’object’變量:objects = \ 于是在需要目標文件名列表的地方,使用$(object) 來代替變量的值。以下是使用了變量以后的makefile:objects = \ edit : $(objects) cc o edit $(objects) : cc c : cc c : cc c : cc c : cc c : cc c : cc c : cc c clean : rm edit $(objects) 簡化命令為每個文件寫出編譯命令不是必要的,因為make可以自己來做;以’.c’文件更新’.o’文件有一個隱含的規(guī)則,使用’cc c’命令。Make將利用’cc –c –o ’,因此在生成目標文件的規(guī)則中,可以省略命令。當(dāng)’.c’文件以這樣的方式使用時,將自動加入到依賴關(guān)系中;由是在省略命令的前提下,可以將’.c’文件從依賴關(guān)系中省略。以下是簡化過的makefile:objects = \ edit : $(objects) cc o edit $(objects) : : : : : : : : .PHONY : cleanclean : rm edit $(objects) 另一種風(fēng)格如果makefile中的目標都是以隱含規(guī)則生成,可以將規(guī)則按照依賴關(guān)系分組:objects = \ edit : $(objects) cc o edit $(objects)$(objects) : : : 這里’’作為所有目標文件的依賴。這種風(fēng)格是好是壞取決于個人喜好,它非常緊湊,但是將每個目標的依賴信息放在一起看起來更清楚一些。 清理編寫規(guī)則不至于編譯程序。Makefile通常描述如何做其它事情:比如刪除目錄中的目標文件和可執(zhí)行文件來清理目錄。例子中是這樣寫的:clean: rm edit $(objects)實際情況是,我們需要處理一些意外事件:存在一個叫做’clean’的文件;如果rm出錯,并不希望make過程停止下來,修改過的版本如下:.PHONY : cleanclean : rm edit $(objects)這樣的規(guī)則當(dāng)然不能放在makefile的開始,因為這并不是我們?nèi)笔∫龅墓ぷ鳌S捎凇痗lean’并不是’edit’的依賴,在運行make時沒有參數(shù)時,這條規(guī)則不會執(zhí)行;要執(zhí)行這個規(guī)則,必須運行’make clean’。MakefileMakefile中包含五種內(nèi)容:顯式規(guī)則,隱式規(guī)則,變量定義,指令(directive)和注釋。l 顯式規(guī)則描述如何生成規(guī)則的目標,它列出了目標依賴的文件,指定了產(chǎn)生或更新目標的命令l 隱式規(guī)則描述如何生成基于文件名的一類文件,說明目標可能依賴于和其文件名類似的文件,指定了相應(yīng)的命令。l 指令類似與編譯器的偽指令,包含:252。 指示make讀入另一個makefile252。 決定是否忽略makefile中的一部分252。 定義一個變量l 一行中‘’開始是注釋,直到行末,除非遇到續(xù)行符號。在’define’和命令中不能有注釋,其它情況下注釋可出現(xiàn)在任何地方。 makefile名字缺省情況下,make以下列名字查找makefile:’GNUmakefile’,’makefile’和’Makefile’(注意大小寫)。通常你的makefile應(yīng)叫做’makefile’或’Makefile’?!疓NUmakefile’不推薦,除非你的makefile是為GNU的make定制的,其它的make不認為該名字是一個makefile的名字。如果你使用非標準命名的makefile,必須用命令開關(guān)’f ’ 或 ’—file’。參數(shù)’ –f NAME’或’—file NAME’告訴make讀入NAME作為makefile。如果使用多個該開關(guān),所有的文件將按順序連接起來。如果使用該選項,標準的makefile名字不會自動檢測。 包含‘include’指令告訴make暫停處理余下的內(nèi)容,讀入其它makefile。語法如下:include FILENAMES …這一行起始可以有空格,但TAB字符不允許。如果文件名包含變量或函數(shù),這些將被擴展。 ‘MAKEFILE’變量如果環(huán)境變量’MAKEFILE’已定義,make認為它的值是一系列空格隔開的文件名,這些文件在處理其它makefile前被make程序讀入。這類似于include指令;這些文件中的目標不會影響缺省目標,而且如果文件未找到的話,make并不認為是錯誤。這個變量的主要用途是遞歸引用make程序時通訊 如何重新生成makefile有時候makefile是從其它文件生成的,比如RCS或SCCS文件。如果makefile是由其它文件生成的,需要make讀入最新版本的makefile。在讀入所有makefile之后,make認為每個makefile是一個目標,試圖去更新它;如果makefile中有一條如何更新它的規(guī)則,或者有適用的隱式規(guī)則,需要的更新會進行。所有的makefile檢查完之后,如果有的改變了,make重新開始再讀入(make會試圖再做更新,但通常不會再改變了,因為已經(jīng)是最新的了)。如果一個文件使用雙冒號規(guī)則,提供了命令但沒有依賴關(guān)系,文件始終會被更新。在makefile的情況下,如果makefile雙冒號規(guī)則,提供了命令但沒有依賴關(guān)系,這樣makefile始終會重新生成,這會導(dǎo)致循環(huán):make只是在不斷更新makefile,卻不干活。為避免這種情況,make不會重新生成那些只有命令沒有依賴關(guān)系的雙冒號規(guī)則的makefile。如果沒有使用’f’或’file’選項,make會嘗試缺省的makefile文件名。和指明’f’或’file’選項不同,make不能確定這些文件是否應(yīng)當(dāng)存在。然而,如果缺省makefile不存在但可以通過運行make規(guī)則生成,你可能希望這些規(guī)則被運行使得makefile可以使用。因此,如果沒有缺省makefile,make試圖按照makefile名查找的順序生成它,直到成功或名字用完。注意如果make 不能找到或生成makefile,這并不是錯誤;makefile不總是必需的。當(dāng)使用’t’或’touch’選項時,不希望使用過時的makefile來決定那個目標來touch。所以’t’選項對makefile更新不起作用;類似’q’(or ‘—question’)和’n’(or ’—justprint’)不阻止makefile的更新,因為過時的makefile會產(chǎn)生錯誤的輸出。這樣’make –f mfile –n foo’會更新’mfile’,讀入它,打印出更新’foo’需要執(zhí)行的命令但不運行這些命令。與’foo’有關(guān)的命令是更新過的’mfile’中的內(nèi)容。但是有時不希望更新makefile,可以將makefile作為命令行的目標,當(dāng)makefile被顯式指定為目標時,’t’選項也適用于它們。這樣’make –f mfile –n mfile foo’會讀入’mfile’,打印出更新執(zhí)行的命令,’foo’的命令是當(dāng)前的’mfile’中的內(nèi)容。 重載makefile可以使用’include’指令來包含其它makefile,增加目標的變量定義。然而,make不允許同一個目標有不同的命令,有其它的途徑可以達到目的。假設(shè)有’makefile’ 和’mfile’,’makfile’要包含’mfile’,但都有對于目標’foo’的規(guī)則。這是可以在’makefile’中寫一條匹配任意模式的規(guī)則,指明當(dāng)make在’makefile’中未找到目標時,搜索’mfile’:foo: frobnicate foo%: force @$(MAKE) f mfile $@ force: 。當(dāng)執(zhí)行’make foo’時,make找到’makefile’,執(zhí)行命令’ frobnicate foo’;執(zhí)行’make bar’時,在’makefile’中未找到相應(yīng)的規(guī)則,這時模式規(guī)則適用,執(zhí)行命令’make –f mfile bar’,’makefile’中未提及的其它目標也是類似的。這種方法之所有工作是因為模式規(guī)則的模式是’%’,可以匹配任何的目標;這條規(guī)則的依賴是’force’,保證即使目標存在命令也會執(zhí)行;’force’規(guī)則的命令為空防止’make’為其搜索隱式規(guī)則-這樣會導(dǎo)致依賴循環(huán)。規(guī)則makefile中的規(guī)則描述如何生成特定的文件,即規(guī)則的目標。規(guī)則列出了目標的依賴文件,指定生成或更新目標的命令。規(guī)則的次序是不重要的,除非是確定缺省目標:缺省目標是第一個makefile中的第一個規(guī)則;如果第一個規(guī)則有多個目標,第一個目標是缺省的。有
點擊復(fù)制文檔內(nèi)容
教學(xué)教案相關(guān)推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1