簡介
什麼是makefile。或許不少Winodws的程序員都不知道這個東西,由於那些Windows的IDE都爲你作了這個工做,但要做一個professional的程序員,makefile仍是必需要懂的。這就好像如今有這麼多的HTML的編輯器,但若是你想成爲一個專業人士,你仍是要了解HTML的標識的含義。特別在Unix下的軟件編譯,你就不能不本身寫makefile了,會不會寫makefile,從一個側面說明了一我的是否具有完成大型工程的能力。由於,makefile關係到了整個工程的編譯規則。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件須要先編譯,哪些文件須要後編譯,哪些文件須要從新編譯,甚至於進行更復雜的功能操做,因makefile就像一個Shell腳本同樣,其中也能夠執行操做系統的命令。makefile帶來的好處就是——「自動化編譯」,一旦寫好,只須要一個make命令,整個工程徹底自動編譯,極大的提升了軟件開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,通常來講,大多數的IDE都有這個命令,好比:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成爲了一種在工程方面的編譯方法。如今講述如何寫makefile的文章比較少,這是我想寫這篇文章的緣由。固然,不一樣產商的make各不相同,也有不一樣的語法,但其本質都是在「文件依賴性」上作文章,這裏,僅對GNU的make進行講述,個人環境是Linux 14.02,make的版本是3.80。必竟,這個make是應用最爲普遍的,也是用得最多的。在這裏,僅對Makefile 的精簡優化經過一個具體的例子進行說明。程序員
1 /**************************初始Makefile*******************************/ 2 edit : main.o kbd.o command.o display.o\ 3 insert.o search.o file.o outil.o 4 cc -o edit main.o kbd.o command.o display.o\ 5 insert.o search.o file.o outil.o 6 main.o : main.c defs.h 7 cc -c main.o 8 kdb.o : kdb.c defs.h command.h 9 cc -c kbd.c 10 command.o : command.c defs.h command.h 11 cc -c command.c 12 display.o : display.c defs.h buffer.h 13 cc -c display.c 14 insert.o : insert.c defs.h buffer.h 15 cc -c insert.c 16 serach.o : search.c defs.h buffer.h 17 cc -c search.c 18 file.o : file.c defs.h buffer.h command.h 19 cc -c file.c 20 outil.o : outil.c defs.h 21 cc -c outil.c 22 23 clean: 24 rm main.o kbd.o command.o display.o\ 25 insert.o search.o file.o outil.o 26 27 /**************************精簡Makefile(1)*******************************/ 28 運用變量和通配符 29 $@ 目標文件 30 $^ 全部依賴文件 31 $* 不帶擴展名的文件 32 $< 第一個依賴文件 33 /************************************************************************/ 34 object = main.o kbd.o command.o display.o\ 35 insert.o search.o file.o outil.o 36 edit :$(objiect) 37 cc -c $@ $^ 38 main.o : main.c defs.h 39 cc -c main.o 40 kdb.o : kdb.c defs.h command.h 41 cc -c kbd.c 42 command.o : command.c defs.h command.h 43 cc -c command.c 44 display.o : display.c defs.h buffer.h 45 cc -c display.c 46 insert.o : insert.c defs.h buffer.h 47 cc -c insert.c 48 serach.o : search.c defs.h buffer.h 49 cc -c search.c 50 file.o : file.c defs.h buffer.h command.h 51 cc -c file.c 52 outil.o : outil.c defs.h 53 cc -c outil.c 54 55 clean: 56 rm edit $(object) 57 /**************************精簡Makefile(2)*******************************/ 58 運用變量和通配符 59 隱晦規則(遇到*.o文件自動推到其依賴*.c文件) 60 /**************************************************************************/ 61 object = main.o kbd.o command.o display.o\ 62 insert.o search.o file.o outil.o 63 edit :$(objiect) 64 cc -c $@ $^ 65 main.o : defs.h 66 cc -c main.o 67 kdb.o : defs.h command.h 68 cc -c kbd.c 69 command.o : defs.h command.h 70 cc -c command.c 71 display.o : defs.h buffer.h 72 cc -c display.c 73 insert.o : defs.h buffer.h 74 cc -c insert.c 75 serach.o : defs.h buffer.h 76 cc -c search.c 77 file.o : defs.h buffer.h command.h 78 cc -c file.c 79 outil.o : defs.h 80 cc -c outil.c 81 82 clean: 83 rm edit $(object) 84 85 /**************************精簡Makefile(3)*******************************/ 86 變量定義和通配符 87 隱晦規則(遇到*.o文件自動推到其依賴*.c文件) 88 文件指示 89 /**************************************************************************/ 90 object = main.o kbd.o command.o display.o\ 91 insert.o search.o file.o outil.o 92 edit :$(objiect) 93 cc -c $@ $^ 94 $(object) : defs.h 95 kbd.o command.o fille.o : comman.h 96 display.o insert.o search.o file.o : buffer.h 97 clean: 98 rm edit $(object) 99 100 /**************************精簡Makefile(4)*******************************/ 101 變量定義和通配符 102 隱晦規則(遇到*.o文件自動推導其依賴*.c文件) 103 文件指示 104 .PHONY clean表示clean是僞目標 105 /*************************************************************************/ 106 object = main.o kbd.o command.o display.o\ 107 insert.o search.o file.o outil.o 108 edit :$(objiect) 109 cc -c $@ $^ 110 $(object) : defs.h 111 kbd.o command.o fille.o : comman.h 112 display.o insert.o search.o file.o : buffer.h 113 .PHONY: clean 114 clean: 115 rm edit $(object) 116 117 /******************************終極版***********************************/ 118 object = main.o kbd.o command.o display.o\ 119 insert.o search.o file.o outil.o 120 edit :$(objiect) 121 cc -c $@ $^ 122 .PHONY: clean 123 clean: 124 rm edit $(object)