1.make/Makefile的重要性
- 會不會寫makefile,從一個側(cè)面說明了一個人是否具備完成大型工程的能力
- 一個工程中的源文件不計數(shù),其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作
- makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程即可完全自動編譯,極大的提高了軟件開發(fā)的效率。
- make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數(shù)的IDE(集成開發(fā)環(huán)境)都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make??梢姡琺akefile都成為了一種在工程方面的編譯方法。
- make是一條命令,makefile是一個文件(在當前源代碼的路徑下),兩個搭配使用,完成項目自動化構(gòu)建。
2.規(guī)則及使用
使用
我們先來看一下make/Makefile在Linux中的簡單使用(先看看豬跑,接著會解析規(guī)則):
第一步:我們先創(chuàng)建一個myfile.c文件,寫入簡單的內(nèi)容
第二步:創(chuàng)建一個Makefile文件,寫入符合Makefile規(guī)則的內(nèi)容
第三步:使用make命令,生成可執(zhí)行程序,使用make clean刪除可執(zhí)行程序
規(guī)則
Makefile是一個圍繞依賴關系和依賴方法構(gòu)建的一個自動化編譯的工具。
1.依賴關系:在這個程序中,myfile可執(zhí)行程序和myfile.c文件構(gòu)成依賴關系,myfile.c的改變會影響myfile,所以myfile依賴于myfile.c。所以第一行就表示myfile可執(zhí)行程序的生成依賴于myfile.c文件。
2.依賴方法:myfile可執(zhí)行程序的生成依賴于myfile.c,而gcc myfile.c -o myfile
就是myfile文件依賴myfile.c的依賴方法。
(注意:完成一件事必須要有正確的依賴關系+正確的依賴方法。)
3.PHONY:被該關鍵字修飾的對象是一個偽目標,即該目標可以總是被執(zhí)行(不需要進行時間新舊的比較),即如果我們希望多次生成一樣的可執(zhí)行程序,就可以用這個關鍵字修飾對象,不過我們一般不這樣操作。大家肯定會有疑問:“???總是被執(zhí)行是什么意思?”
我們接下來以這個Makefile文件為例,myfile.c文件的內(nèi)容還是不變的。
make原理:這段代碼,充分體現(xiàn)了依賴關系與依賴方法:make會在當前目錄下找名字為“Makefile”或“makefile”的文件,然后找到第一個依賴關系,myfile的生成依賴于myfile.o,myfile.o的生成依賴于myfile.s,myfile.s的生成依賴于myfile.i,myfile.i的生成依賴于myfile.c,然后gcc的內(nèi)容分別是它們的依賴方法。然后clean就是清理,當我們在命令行輸入make clean,就會執(zhí)行rm -f myfile myfile.i myfile.o myfile.s
這句指令,就可以直接刪除這些文件了。這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現(xiàn)錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起,我就不工作啦。
項目清理:工程是需要被清理的。像clean這種,沒有被第一個目標文件直接或間接關聯(lián),那么它后面所定義的命令將不會被自動執(zhí)行,不過,我們可以顯示要make執(zhí)行。即命令——“make clean”,以此來清除所有的目標文件,以便重編譯。但是一般我們這種clean的目標文件,我們將它設置為偽目標,用 .PHONY 修飾,偽目標的特性是,總是被執(zhí)行的。
這段代碼第一次執(zhí)行make,可以正常執(zhí)行,然鵝,我們第二次在命令行輸入make,就無法再次被執(zhí)行了。然鵝,大家看上圖make clean被執(zhí)行一次生效之后,我們再執(zhí)行一次,還是可以生效。那么這就是.PHONY的作用,也就是“總是被執(zhí)行”的意思。如果大家希望make指令可以總是被執(zhí)行,那么就在開頭加上.PHONY。那么在不加.PHONY,gcc是怎么知道我們不需要再編譯了呢?
方法:如果我們make之后,又對源文件進行修改,則我們還可以再執(zhí)行make指令(即編譯器會判斷myfile.c的modify時間是否早于myfile可執(zhí)行程序,如果晚于myfile,則說明myfile.c文件發(fā)生修改,make可以繼續(xù)執(zhí)行,生成新的程序,覆蓋舊的程序)。
注意:make是一條命令,makefile是一個文件(在當前源代碼的路徑下),兩個搭配使用,完成項目自動化構(gòu)建。make指令默認執(zhí)行Makefile文件中第一個依賴方法。如果你想運行指定的程序,就要顯示定義,例如上述的make clean。
例如我們將Makefile文件改成如下代碼并wq退出,在命令行輸入make指令,就會先執(zhí)行rm指令。
3.Makefile編譯多文件
當我們的工程中有多個源文件的時候,我們要如何進行編譯?
首先,我們可以直接使用gcc指令對多個源文件進行編譯,進而生成可執(zhí)行程序。注意用這種方式編譯文件,不需要加上頭文件,因為編譯器通過源文件的內(nèi)容可以直接知道所需頭文件的名字。
但進行多文件編譯的時候,一般不直接用gcc生成可執(zhí)行程序,而是先用每個源文件生成各自的二進制文件,即.o文件,然后再將這些二進制文件通過鏈接生成可執(zhí)行程序。但是隨著源文件個數(shù)的增加,指令長度也會增長,所以我們就需要用到項目自動化構(gòu)建工具make/Makefile,這樣可以大大提高編譯運行的效率。
原因:
- 如果直接使用源文件生成可執(zhí)行程序,那么若有一個.c文件發(fā)生了修改,我們再生成可執(zhí)行文件就需要將之前的所有源文件重新進行編譯鏈接。
- 如果每個源文件先生成自己的.o目標文件,那么一個源文件被修改,我們就只需要重新編譯該源文件的二進制文件,然后將所有二進制文件進行鏈接。這樣大大提高了程序編譯運行的效率。
步驟一: 在源文件所在目錄下創(chuàng)建一個名為Makefile/makefile的文件。
步驟二: 編寫Makefile文件。
執(zhí)行結(jié)果:
補充:Makefile文件的快捷書寫方式文章來源:http://www.zghlxwxcb.cn/news/detail-407748.html
- $@:表示依賴關系中的目標文件(冒號左側(cè))。
- $^:表示依賴關系中的依賴文件列表(冒號右側(cè))。
- $<:表示依賴關系中的第一個依賴文件(冒號右側(cè)第一個)。
所以上述文件,還可以寫成:文章來源地址http://www.zghlxwxcb.cn/news/detail-407748.html
到了這里,關于【Linux】項目自動化構(gòu)建工具-make/Makefile的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!