简介
什么是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)