在linux中,有一个重要的自动化编译命令—make,在源码文件的安装和开发大型项目的时候,都需要用到这个命令,
例 安装程序和安装检测 make , make install make test
例 卸载安装文件 make clean
采用make 命令编译大型项目,可以使编译工作变的简单而有序,通过编写MakeFile 描述文件可以使整个项目中所有源文件之间的依赖关系一清二楚。
如果没有make 命令,那么编译程序将会是一份非常复杂的事情,合理的使用make命令和Makefile文件可以提高大型项目的开发效率,编写Makefile是linux开发人员必备的技能。
make命令主要作用是执行Makefile文件,通过Makefile文件描述源程序之间的依赖关系,进行自动维护编译,要想熟练的运用make命令,需熟练掌握编写 Makefile文件的技能。
Makefile文件
在程序编写中默认是采用Makefile作为自动化编译描述文件,如果习惯采用其它文件名 例 将描述文件放入 “Makefile20150225” 则执行make命令的时候,需要显式的指定Makefile文件
[root@localhost ~]#make -f Makefile20150225
例如,一个名为httpd的程序由三个C源文件httpd.c、httpdSend.c和httpdRec.c编译生成,这三个文件还分别包含自己的头文件httpd.h 、httpdSend.h和httpdRec.h。通常情况下,C编译器将会输出三个目标文件httpd.o、httpdSend.o和httpdRec.o。假设httpd.c和httpdSend.c都要声明用到一个名为stdlibHttpd的文件,但httpdRec.c不用。即在httpd.c和httpdSend.c里都有这样的声明:
#include “stdlibHttpd”
那么下面的文档就描述了这些文件之间的相互联系:
#makeFile 例子演示
1 httpd: httpd.o httpdSend.o httpdRec.o
2 cc httpd.o httpdSend.o httpdRec.o -o httpd
3 httpd.o : httpd.c httpd.h stdlibHttpd
4 cc -c httpd.c
5 httpdSend.o : httpdSend.c httpdSend.h stdlibHttpd
6 cc -c httpdSend.c
7 httpdRec.o : httpdRec.c httpdRec.h
8 cc -c httpdRec.c
以上就是一个简单的Makefile描述文件
从描述文件可以看出,第一个字符为 # 的行为注释行。
第一行表示 httpd程序需要由httpd.o httpdSend.o httpdRec.o 这三个目标文件组成,表示依赖关系的时候需要采用:
第二行表示 就是执行cc命令 编译生成httpd
第3,4行 第5,6行 第7,8行
在make命令中 ,会自动判断文件的最后一次修改时间,来决定所生成的文件是否需要重新编译.
Makefile描述文件一般需要包含以下内容:
1 宏定义 (变量定义)
2 源文件之间的相互依赖关系
3 可执行的命令
Makefile文件中允许使用变量,当变量的字符大于一个字符的时候,需要采用();如下所示
下面都是有效的宏引用:
$(bianLiang)
$X
$(X)
其中$X 和$(X)所表达的效果是一致的
使用变量,可以避免描述文件中过多的长文件,使描述文件更加清晰,修改方便.
#定义一个变量表示文件集合
fileAll= httpd.o httpdSend.o httpdRec.o
httpd: $(fileAll)
cc $(fileAll) -o httpd
一般情况下会在Makefile 的最后还会加入标签 clean ,用来执行一些清除操作 例如 删除安装程序 删除目标文件,例如:
clean:
rm -f *.o
rm -f httpd
运行 make clean 时,将执行 rm -f *.o rm -f httpd 命令,将删除所有目标文件和httpd文件。
综上所述,一个简单的Makefile文件就可以编写完毕。