9.Makefile隱含規(guī)則

      網(wǎng)友投稿 899 2025-04-04

      這個(gè)章節(jié)講述的是 Makefile 的隱含規(guī)則,所謂的隱含規(guī)則就是需要我們做出具體的操作,系統(tǒng)自動(dòng)完成。編寫 Makefile 的時(shí)候,可以使用隱含規(guī)則來(lái)簡(jiǎn)化Makefile 文件編寫。

      實(shí)例:

      test:test.o

      gcc -o test test.o

      test.o:test.c

      我們可以在 Makefile 中這樣寫來(lái)編譯 test.c 源文件,相比較之前少寫了重建 test.o 的命令。但是執(zhí)行 make,發(fā)現(xiàn)依然重建了 test 和 test.o 文件,運(yùn)行結(jié)果卻沒(méi)有改變。這其實(shí)就是隱含規(guī)則的作用。在某些時(shí)候其實(shí)不需要給出重建目標(biāo)文件的命令,有的甚至可以不需要給出規(guī)則。實(shí)例:

      test:test.o

      gcc -o test test.o

      運(yùn)行的結(jié)果是相同的。

      注意:隱含條件只能省略中間目標(biāo)文件重建的命令和規(guī)則,但是最終目標(biāo)的命令和規(guī)則不能省略。

      隱含規(guī)則的具體的工作流程:make 執(zhí)行過(guò)程中找到的隱含規(guī)則,提供了此目標(biāo)的基本依賴關(guān)系。確定目標(biāo)的依賴文件和重建目標(biāo)需要使用的命令行。隱含規(guī)則所提供的依賴文件只是一個(gè)基本的(在C語(yǔ)言中,通常他們之間的對(duì)應(yīng)關(guān)系是:test.o 對(duì)應(yīng)的是 test.c 文件)。當(dāng)需要增加這個(gè)文件的依賴文件的時(shí)候要在 Makefile 中使用沒(méi)有命令行的規(guī)則給出。實(shí)例:

      test:test.o

      gcc -o test test.o

      test:test1.h

      其實(shí)在有些時(shí)候隱含規(guī)則的使用會(huì)出現(xiàn)問(wèn)題。因?yàn)橛幸粋€(gè) make 的“隱含規(guī)則庫(kù)”。庫(kù)中的每一條隱含規(guī)則都有相應(yīng)的優(yōu)先級(jí)順序,優(yōu)先級(jí)也就會(huì)越高,使用時(shí)也就會(huì)被優(yōu)先使用。

      例如在 Makefile 中添加這行代碼:

      foo.o:foo.p

      我們都知道 .p 文件是 Pascal 程序的源文件,如果書(shū)寫規(guī)則時(shí)不加入命令的話,那么 make 會(huì)按照隱含的規(guī)則來(lái)重建目標(biāo)文件 foo.o。如果當(dāng)前目錄下恰好存在 foo.c 文件的時(shí)候,隱含規(guī)則會(huì)把 foo.c 當(dāng)做是 foo.o 的依賴文件進(jìn)行目標(biāo)文件的重建。因?yàn)榫幾g .c 文件的隱含規(guī)則在編譯 .p 文件之前,顯然優(yōu)先級(jí)也會(huì)越高。當(dāng) make 找到生成 foo.o 的文件之后,就不會(huì)再去尋找下一條規(guī)則。如果我們不想使用隱含規(guī)則,在使用的時(shí)候不僅要聲明規(guī)則,也要添加上執(zhí)行的命令。

      這里講的是預(yù)先設(shè)置的隱含規(guī)則。如果不明確的寫下規(guī)則,那么make 就會(huì)自己尋找所需要的規(guī)則和命令。當(dāng)然我們也可以使用 make 選項(xiàng):-r或-n-builtin-rules選項(xiàng)來(lái)取消所有的預(yù)設(shè)值的隱含規(guī)則。當(dāng)然即使是指定了“-r”的參數(shù),某些隱含規(guī)則還是會(huì)生效。因?yàn)橛泻芏嗟碾[含規(guī)則都是使用了后綴名的規(guī)則來(lái)定義的,所以只要隱含規(guī)則中含有“后綴列表”那么隱含規(guī)則就會(huì)生效。默認(rèn)的列表是:

      9.Makefile隱含規(guī)則

      .out、.a、.in、.o、.c、.cc、.C、.p、.f、.F、.r、.y、.l、.s、.S、.mod、.sym、.def、

      .h、.info、.dvi、.tex、.texinfo、.texi、.txinfo、.w、.ch、.web、.sh、.elc、.el。

      下面是一些常用的隱含規(guī)則:

      編譯 C 程序

      編譯?C++?程序

      編譯 Pascal 程序

      編譯 Fortran/Ratfor 程序

      預(yù)處理 Fortran/Ratfor 程序

      編譯 Modula-2 程序

      匯編和需要預(yù)處理的匯編程序

      鏈接單一的 object 文件

      Yacc C 程序

      Lex C 程序時(shí)的隱含規(guī)則

      上面的編譯順序都是一些常用的編程語(yǔ)言執(zhí)行隱含規(guī)則的順序,我們?cè)?Makefile 中指定規(guī)則時(shí),可以參考這樣的列表。當(dāng)需要編譯源文件的時(shí)候,考慮是不是需要使用隱含規(guī)則。如果不需要,就要把相應(yīng)的規(guī)則和命令全部書(shū)寫上去。

      內(nèi)嵌隱含規(guī)則的命令中,所使用的變量都是預(yù)定義的。我們將這些變量稱為“隱含變量”。這些變量允許修改:可以通過(guò)命令行參數(shù)傳遞或者是設(shè)置系統(tǒng)環(huán)境變量的方式都可以對(duì)它進(jìn)行重新定義。無(wú)論使用哪種方式,只要 make 在運(yùn)行的,這些變量的定義有效。Makefile 的隱含規(guī)則都會(huì)使用到這些變量。

      比如我們編譯 .c 文件在我們的 Makefile 中就是隱含的規(guī)則,默認(rèn)使用到的編譯命令時(shí)cc,執(zhí)行的命令時(shí)cc -c我們可以對(duì)用上面的任何一種方式將CC定義為ncc。這樣我們就編譯 .c 文件的時(shí)候就可以用ncc進(jìn)行編譯。

      隱含規(guī)則中使用的變量可以分成兩類:

      1.代表一個(gè)程序的名字。例如:“CC”代表了編譯器的這個(gè)可執(zhí)行程序。

      2.代表執(zhí)行這個(gè)程序使用的參數(shù).例如:變量“CFLAGS”。多個(gè)參數(shù)之間使用空格隔開(kāi)。

      下面我們來(lái)列舉一下代表命令的變量,默認(rèn)都是小寫。

      AR:函數(shù)庫(kù)打包程序,科創(chuàng)價(jià)靜態(tài)庫(kù) .a 文檔。

      AS:應(yīng)用于匯編程序。

      CC:C 編譯程序。

      CXX:C++編譯程序。

      CO:從 RCS 中提取文件的程序。

      CPP:C程序的預(yù)處理器。

      FC:編譯器和與處理函數(shù) Fortran 源文件的編譯器。

      GET:從CSSC 中提取文件程序。

      LEX:將Lex語(yǔ)言轉(zhuǎn)變?yōu)?C 或 Ratfo 的程序。

      PC:Pascal 語(yǔ)言編譯器。

      YACC:Yacc 文法分析器(針對(duì)于C語(yǔ)言)

      YACCR:Yacc 文法分析器。

      Makefile 匯編語(yǔ)言

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:實(shí)例來(lái)說(shuō)明countif函數(shù)的作用 快速統(tǒng)計(jì)與高級(jí)用法(countif函數(shù)的用法及其意義)
      下一篇:WPS中5個(gè)超實(shí)用技巧使用操作
      相關(guān)文章
      国产亚洲免费的视频看| 日本系列1页亚洲系列| 国产精品亚洲一区二区在线观看| 亚洲精品中文字幕麻豆| 亚洲一区免费观看| 亚洲电影一区二区三区| 亚洲av日韩综合一区在线观看| 久久久久久a亚洲欧洲aⅴ| 久久精品国产亚洲网站| 国产亚洲成av人片在线观看| 亚洲无人区午夜福利码高清完整版| 亚洲中久无码不卡永久在线观看| 国产精品亚洲产品一区二区三区| 亚洲人成国产精品无码| 国产成人亚洲精品91专区手机| 亚洲日韩国产精品乱| 亚洲男人第一无码aⅴ网站| 亚洲精品第一国产综合境外资源| 亚洲精品97久久中文字幕无码| 夜色阁亚洲一区二区三区| 亚洲av无码乱码在线观看野外| 亚洲国产精品嫩草影院久久| 亚洲精品乱码久久久久久蜜桃| 亚洲一区二区三区乱码A| 亚洲中文字幕无码一区| 亚洲精品夜夜夜妓女网| 亚洲Av无码精品色午夜 | 99亚洲精品高清一二区| 久久亚洲精品中文字幕| 亚洲无成人网77777| 亚洲一线产区二线产区精华| 日韩亚洲不卡在线视频中文字幕在线观看 | 亚洲狠狠久久综合一区77777| 亚洲天天在线日亚洲洲精| 亚洲福利一区二区| 亚洲狠狠成人综合网| 麻豆亚洲AV成人无码久久精品 | 亚洲AV无码一区东京热| 久久亚洲精品无码VA大香大香| 亚洲制服丝袜精品久久| 亚洲精华国产精华精华液|