日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Makefile 学习 2 - 基于若干 Blog 的汇总

發(fā)布時(shí)間:2025/6/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Makefile 学习 2 - 基于若干 Blog 的汇总 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

基于若干 Blog 匯總的 makefile 教程

陳皓 https://blog.csdn.net/haoel/article/details/2886

Makefile 進(jìn)階

1. Makefile 中的內(nèi)容

  • 顯式規(guī)則。顯式規(guī)則說明了,如何生成一個(gè)或多的的目標(biāo)文件。這是由Makefile的書寫者明顯指出,要生成的文件,文件的依賴文件,生成的命令。
  • 隱晦規(guī)則。由于我們的make有自動(dòng)推導(dǎo)的功能,所以隱晦的規(guī)則可以讓我們比較粗糙地簡略地書寫Makefile,這是由make所支持的。
  • 變量的定義。在Makefile中我們要定義一系列的變量,變量一般都是字符串,這個(gè)有點(diǎn)你C語言中的宏,當(dāng)Makefile被執(zhí)行時(shí),其中的變量都會被擴(kuò)展到相應(yīng)的引用位置上。
  • 文件指示。其包括了三個(gè)部分,一個(gè)是在一個(gè)Makefile中引用另一個(gè)Makefile,就像C語言中的include一樣;另一個(gè)是指根據(jù)某些情況指定Makefile中的有效部分,就像C語言中的預(yù)編譯#if一樣;還有就是定義一個(gè)多行的命令。有關(guān)這一部分的內(nèi)容,我會在后續(xù)的部分中講述。
  • 注釋。Makefile中只有行注釋,和UNIX的Shell腳本一樣,其注釋是用“#”字符,這個(gè)就像C/C++中的“//”一樣。如果你要在你的Makefile中使用“#”字符,可以用反斜框進(jìn)行轉(zhuǎn)義,如:“#”。
  • 2. Makefile 文件名

    默認(rèn)的情況下,make命令會在當(dāng)前目錄下按順序找尋文件名為“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解釋這個(gè)文件。在這三個(gè)文件名中,最好使用“Makefile”這個(gè)文件名,因?yàn)?#xff0c;這個(gè)文件名第一個(gè)字符為大寫,這樣有一種顯目的感覺。最好不要用“GNUmakefile”,這個(gè)文件是GNU的make識別的。有另外一些make只對全小寫的“makefile”文件名敏感,但是基本上來說,大多數(shù)的make都持“makefile”和“Makefile”這兩種默認(rèn)文件名。

    當(dāng)然,你可以使用別的文件名來書寫Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,你可以使用make的“-f”和“--file”參數(shù),如:make -f Make.Linux或make --file Make.AIX。

    3. 引用別的 Makefile

    在Makefile使用include關(guān)鍵字可以把別的Makefile包含進(jìn)來,這很像C語言的 #include,被包含的文件會原模原樣的放在當(dāng)前文件的包含位置。include的語法是:

    include<filename>filename可以是當(dāng)前操作系統(tǒng)Shell的文件模式(可以保含路徑和通配符)

    在include前面可以有一些空字符,但是絕不能是[Tab]鍵開始。include和可以用一個(gè)或多個(gè)空格隔開。舉個(gè)例子,你有這樣幾個(gè)Makefile:a.mk、b.mk、c.mk,還有一個(gè)文件叫foo.make,以及一個(gè)變量$(bar),其包含了e.mk和f.mk,那么,下面的語句:

    include foo.make *.mk $(bar)

    等價(jià)于:

    include foo.make a.mk b.mk c.mk e.mk f.mk

    make命令開始時(shí),會把找尋include所指出的其它Makefile,并把其內(nèi)容安置在當(dāng)前的位置。就好像C/C++的#include指令一樣。如果文件都沒有指定絕對路徑或是相對路徑的話,make會在當(dāng)前目錄下首先尋找,如果當(dāng)前目錄下沒有找到,那么,make還會在下面的幾個(gè)目錄下找:

    1.如果make執(zhí)行時(shí),有“-I”或“--include-dir”參數(shù),那么make就會在這個(gè)參數(shù)所指定的目錄下去尋找。
    2.如果目錄/include(一般是:/usr/local/bin或/usr/include)存在的話,make也會去找。

    如果有文件沒有找到的話,make會生成一條警告信息,但不會馬上出現(xiàn)致命錯(cuò)誤。它會繼續(xù)載入其它的文件,一旦完成makefile的讀取,make會再重試這些沒有找到,或是不能讀取的文件,如果還是不行,make才會出現(xiàn)一條致命信息。如果你想讓make不理那些無法讀取的文件,而繼續(xù)執(zhí)行,你可以在include前加一個(gè)減號“-”。如:
    -include
    其表示,無論include過程中出現(xiàn)什么錯(cuò)誤,都不要報(bào)錯(cuò)繼續(xù)執(zhí)行。和其它版本make兼容的相關(guān)命令是sinclude,其作用和這一個(gè)是一樣的。

    4. Makefile 的工作方式

    stage1:

  • 讀入所有的Makefile。
  • 讀入被include的其它Makefile。
  • 初始化文件中的變量。
  • 推導(dǎo)隱晦規(guī)則,并分析所有規(guī)則。
  • 為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系鏈。
  • stage2:

  • 根據(jù)依賴關(guān)系,決定哪些目標(biāo)要重新生成。
  • 執(zhí)行生成命令。
  • 第一個(gè)階段中,如果定義的變量被使用了,那么,make會把其展開在使用的位置。但make并不會完全馬上展開,make使用的是拖延戰(zhàn)術(shù),如果變量出現(xiàn)在依賴關(guān)系的規(guī)則中,那么僅當(dāng)這條依賴被決定要使用了,變量才會在其內(nèi)部展開。

    5. Makefile 中的通配符

    ~
    波浪號(“~”)字符在文件名中也有比較特殊的用途。如果是“~/test”,這就表示當(dāng)前用戶的$HOME目錄下的test目錄。而“~hchen/test”則表示用戶hchen的宿主目錄下的test目錄。(這些都是Unix下的小知識了,make也支持)而在Windows或是MS-DOS下,用戶沒有宿主目錄,那么波浪號所指的目錄則根據(jù)環(huán)境變量“HOME”而定。


    通配符代替了你一系列的文件,如“.c”表示所以后綴為c的文件。一個(gè)需要我們注意的是,如果我們的文件名中有通配符,如:“”,那么可以用轉(zhuǎn)義字符“\”,如“”來表示真實(shí)的“”字符,而不是任意長度的字符串。

    clean:rm -f *.o

    上面這個(gè)例子我不不多說了,這是操作系統(tǒng)Shell所支持的通配符。這是在命令中的通配符。

    print: *.clpr -p $?touch print

    上面這個(gè)例子說明了通配符也可以在我們的規(guī)則中,目標(biāo)print依賴于所有的[.c]文件。其中的“$?”是一個(gè)自動(dòng)化變量,我會在后面給你講述。

    objects = *.o

    上面這個(gè)例子,表示了,通符同樣可以用在變量中。并不是說 [.o] 會展開,不!objects的值就是“.o”。Makefile中的變量其實(shí)就是C/C++中的宏。如果你要讓通配符在變量中展開,也就是讓objects的值是所有[.o]的文件名的集合,那么,你可以這樣:

    objects := $(wildcard *.o)

    這種用法由關(guān)鍵字“wildcard”指出,關(guān)于Makefile的關(guān)鍵字,我們將在后面討論。

    6. 文件搜尋

    在一些大的工程中,有大量的源文件,我們通常的做法是把這許多的源文件分類,并存放在不同的目錄中。所以,當(dāng)make需要去找尋文件的依賴關(guān)系時(shí),你可以在文件前加上路徑,但最好的方法是把一個(gè)路徑告訴make,讓make在自動(dòng)去找。

    Makefile文件中的特殊變量“VPATH”就是完成這個(gè)功能的,如果沒有指明這個(gè)變量,make只會在當(dāng)前的目錄中去找尋依賴文件和目標(biāo)文件。如果定義了這個(gè)變量,那么,make就會在當(dāng)當(dāng)前目錄找不到的情況下,到所指定的目錄中去找尋文件了。

    VPATH = src:../headers

    上面的的定義指定兩個(gè)目錄,“src”和“../headers”,make會按照這個(gè)順序進(jìn)行搜索。目錄由“冒號”分隔。(當(dāng)然,當(dāng)前目錄永遠(yuǎn)是最高優(yōu)先搜索的地方)

    另一個(gè)設(shè)置文件搜索路徑的方法是使用make的“vpath”關(guān)鍵字(注意,它是全小寫的),這不是變量,這是一個(gè)make的關(guān)鍵字,這和上面提到的那個(gè)VPATH變量很類似,但是它更為靈活。它可以指定不同的文件在不同的搜索目錄中。這是一個(gè)很靈活的功能。它的使用方法有三種:

  • vpath < pattern> < directories> 為符合模式< pattern>的文件指定搜索目錄。
  • vpath < pattern> 清除符合模式< pattern>的文件的搜索目錄。
  • vpath 清除所有已被設(shè)置好了的文件搜索目錄。
  • vapth使用方法中的< pattern>需要包含“%”字符?!?”的意思是匹配零或若干字符,例如,“%.h”表示所有以“.h”結(jié)尾的文件。< pattern>指定了要搜索的文件集,而< directories>則指定了的文件集的搜索的目錄。例如:

    vpath %.h ../headers

    該語句表示,要求make在“../headers”目錄下搜索所有以“.h”結(jié)尾的文件。(如果某文件在當(dāng)前目錄沒有找到的話)

    我們可以連續(xù)地使用vpath語句,以指定不同搜索策略。如果連續(xù)的vpath語句中出現(xiàn)了相同的< pattern>,或是被重復(fù)了的< pattern>,那么,make會按照vpath語句的先后順序來執(zhí)行搜索。如:

    vpath %.c foovpath % blishvpath %.c bar

    其表示“.c”結(jié)尾的文件,先在“foo”目錄,然后是“blish”,最后是“bar”目錄。

    vpath %.c foo:barvpath % blish

    而上面的語句則表示“.c”結(jié)尾的文件,先在“foo”目錄,然后是“bar”目錄,最后才是“blish”目錄。

    轉(zhuǎn)載于:https://my.oschina.net/u/2362565/blog/2122757

    總結(jié)

    以上是生活随笔為你收集整理的Makefile 学习 2 - 基于若干 Blog 的汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。