背景
- 會不會寫makefile,從側(cè)面說明了一個(gè)人是否具備完成大型工程的能力。
- 一個(gè)工程中的源文件不計(jì)數(shù),其按類型、功能、模塊分別放在若干個(gè)目錄中,makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復(fù)雜的功能操作。
- makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個(gè)make命令,整個(gè)工程完全自動編譯,極大的提高了軟件開發(fā)的效率。
- make是一個(gè)命令工具,是一個(gè)解釋makefile中指令的工具,一般來說,大多數(shù)的IDE都有這個(gè)命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。
- make是一條命令,makefile是一個(gè)文件,兩個(gè)搭配使用,完成項(xiàng)目自動化構(gòu)建。
實(shí)例代碼
C代碼
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
return 0;
}
Makefile文件
hello:hello.o
gcc -o hello hello.o
hello.o:hello.s
gcc -c -o hello.o hello.s
hello.s:hello.i
gcc -S -o hello.s hello.i
hello.i:hello.c
gcc -E -o hello.i hello.c
.PHONY:clean
clean:
rm -f hello.i hello.s hello.o hello
語法說明
依賴關(guān)系
- 上面的文件 hello ,它依賴 hello.o?
- ?hello.o ,它依賴 hello.s?
- ?hello.s ,它依賴 hello.i?
- ?hello.i ,它依賴 hello.c?
依賴方法
- ?gcc -option hello.* hello.* ,就是與之對應(yīng)的依賴方法。
make執(zhí)行效果
原理
make是如何工作的,在默認(rèn)的方式下,也就是我們只輸入make命令。那么:
- make會在當(dāng)前目錄下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它會找文件中的第一個(gè)目標(biāo)文件(target),在上面的例子中,他會找到“hello”這個(gè)文件,并把這個(gè)文件作為最終的目標(biāo)文件。
- 如果hello文件不存在,或是hello所依賴的后面的hello.o文件的文件修改時(shí)間要比hello這個(gè)文件新(可以用 touch 測試),那么,他就會執(zhí)行后面所定義的命令來生成hello這個(gè)文件。
- 如果hello所依賴的hello.o文件不存在,那么make會在當(dāng)前文件中找目標(biāo)為hello.o文件的依賴性,如果找到則再根據(jù)那一個(gè)規(guī)則生成hello.o文件。(這有點(diǎn)像一個(gè)堆棧的過程)
- 當(dāng)然,你的C文件和H文件是存在的啦,于是make會生成hello.o文件,然后再用hello.o文件聲明make的終極任務(wù):執(zhí)行文件hello。
- 這就是整個(gè)make的依賴性,make會一層又一層的去找文件的依賴關(guān)系,直到最終編譯出第一個(gè)目標(biāo)文件。
- 在找尋的過程中,如果出現(xiàn)錯(cuò)誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報(bào)錯(cuò),而對于所定義的命令的錯(cuò)誤,或是編譯不成功,make根本不理。
- make只管文件的依賴性,即:如果在我找了依賴關(guān)系之后,冒號后面的文件還是不在,那么對不起,我就不工作啦。
項(xiàng)目清理
- 工程是需要被清理的
- 像clean這種,沒有被第一個(gè)目標(biāo)文件直接或間接關(guān)聯(lián),那么它后面所定義的命令將不會被自動執(zhí)行,不過,我們可以顯示要make執(zhí)行。即命令——“make clean”,以此來清除所有的目標(biāo)文件,以便重新編譯。
- 但是一般我們這種clean的目標(biāo)文件,我們將它設(shè)置為偽目標(biāo),用 .PHONY 修飾,偽目標(biāo)的特性是,總是被執(zhí)行的。
- 可以將我們的 hello 目標(biāo)文件聲明成偽目標(biāo),測試一下。
clean執(zhí)行效果
文章來源:http://www.zghlxwxcb.cn/news/detail-760918.html
END文章來源地址http://www.zghlxwxcb.cn/news/detail-760918.html
到了這里,關(guān)于【Linux】項(xiàng)目自動化構(gòu)建工具 - make/Makefile的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!