在linux上写一个简单的makefile文件

什么是 makefile?或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的 IDE 都为你做了这个工作,但我觉得要作一个好的和 professional 的程序员,makefile 还是要懂。 这就好像现在有这么多的 HTML 的编辑器,但如果你想成为一个专业人士,你还是要了解 HTML 的标识的含义。特别在 Unix 下的软件编译,你就不能不自己写 makefile 了,会不会 写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功 能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编 译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。

makefile 带来的好处就是——“自动化编译”,一旦写好,永久使用,只需要一个 make 命令,整个工程 完全自动编译,极大的提高了软件开发的效率。

举个简单的例子来看看makefile文件怎么写:

main: main.o list.o // 通过main.o和list.o生成可执行文件main
	gcc -o main main.o lilst.o // 编译,**一定要以tab键开头,不能点几个空格键**
main.o:main.c // 通过main.c生成main.o文件
	gcc -c main.c
list.o:list.c // 通过list.c生成list.o文件
	gcc -c list.c

这个例子是所有需要编译的文件在一个文件夹中,但实际情况一般不是这样,当文件不在一个文件夹中是需要在makefile文件中提供路径,例如:

VPATH=List // 加上指定的路径,可以是相对路径也可以是绝对路径
main: main.o list.o 
	gcc -o main main.o lilst.o
main.o:main.c 
	gcc -c main.c
list.o:list.c
	gcc -c list.c

但这样写未免太麻烦,新加入一个c文件或重命名一个文件就要改动很多地方。可以通过一下方法简化makefile文件
1.变量
2.make隐式推倒 1)中间文件生成时,所依赖的源文件
2)生成命令 gcc
3.VPATH环境变量 制定搜索路径
4.CC环境变量 制定编译工具
经过终极简化后的makefile文件如下

VPATH=List:DoubLelist//这里我将两个c文件放在两个不同的文件夹
filename=main.o\//注意这里的文件要写成.o文件,系统会通过之后的命令自动生成对应的.o文件
		list.o\	//这里的‘\’符号为换行符,不能直接按回车换行
		doublelist.o

main:$(filename)//生成可执行文件main
$(filename)://生成所需要的.o文件

最后,使用makefile文件
在默认方式下,只需要输入make命令。
1.系统会在当前目录下找名字为“Makefile”或“makefile”的文件。
2.如果找到,它会找文件中的第一个目标文件(target),在上面的例子中的可执行文件main,并把这个文件作文最终文件
3.如果这个文件不存在,那么系统就会执行后面做定义的命令来生成main文件
4.如果这个文件存在,系统会查找修改时间比main文件新的文件进行编译,而其余文件则略过,最后生成新的main文件(当应用在大型工程上时这样可以节省大量重复编程的时间。)

你可能感兴趣的:(在linux上写一个简单的makefile文件)