本文转载自CSDN博客,http://blog.csdn.net/Sunboy_2050/archive/2010/07/06/5717253.aspx
1.无makefile的编译过程
gcc -c file.c -o file.ogcc -o file file.o file2.o
2.初级makefile的写法
Make命令会默认调用makefile文件
Linux makefile(Makefile)文件的编写规范和方法:
1)需要由make工具创建目标体target,即通常的目标文件或可执行文件
2)声明并给出创建的目标体所依赖的文件(dependency-file)
3)编写完成创建每个目标体时所需要执行的命令(command)
具体格式如下:
target: dependency-file1 dependency-file2 dependency-file3 ...
command
target:规划的目标。通常是程序中间体或最后所需要生成的文件名,如 *.o或obj可执行文件的名称。此外,target目标也可以是make执行动作的名称,如clean等
dependency-file:规则的依赖。生成规则目标所需要的文件名列表,通常是一个目标依赖于一个或多个文件。
command:规则的命令。make程序所执行的的动作,可以为shell命令或者在shell下执行的程序。一个规则可以有多条命令,每条命令占一行。 在此特别需要注意的是每条命令行开始必须以Tab字符缩进开始,Tab缩进字符会告诉make命令此行是一个命令行,make按照命令完成此行相应的动作。这是在书写makefile(Makefile)文件时最易忽视和犯错的地方,而且大多比较隐蔽。
命令实质上市对任何一个目标的依赖文件发生变化后重建目标的动作描述。一个目标可以没有依赖而只有动作,即只有命令,如clean。此目标只有命令,没有依赖,主要作用是用来删除make过程中产生的中间文件(*.o),做收尾清理工作。
3.makefile例子
main: main.o add_int.o add_float.o sub_int.o sub_float.o
gcc -o main main.o add_int.o add_float.o sub_int.o sub_float.o
main.o: main.c add.h sub.h
gcc -c main.c -o main.o
add_int.o: sub_int.c add.h
gcc -c add_int.c -o add_int.o
add_float.o: sub_float.c add.h
gcc -c add_float.c -o add_float.o
sub_int.o: sub_int.c sub.h
gcc -c sub_int.c -o sub_int.o
sub_float.o: sub_float.c sub.h
gcc -c sub_float.c -o sub_float.o
clean:
rm -f *.o main
4.高级makefile例子
定义变量名
OBJ=main.o add_int.o add_float.o sub_int.o sub_float.o
make: $(OBJ)
gcc -c main.c -o main.o
取得变量对应的值 $(变量名)
5.利用make的自动推导功能
CC=gcc
OBJ=main.o add_int.o add_float.o sub_int.o sub_float.o
make: $(OBJ)
$(CC) -o main $(OBJ)
main.o: add.h sub.h
add_int.o: add.h
add_float.o: add.h
sub_int.o: sub.h
sub_float.o: sub.h
PHONY: clean
clean:
rm -f $(OBJ) main
6.使用自动变量($^ $< $@
$@ : 目标文件
$^ : 所有依赖文件
$< : 第一个依赖文件
7.makefile缺省规则
makefile的缺省规则如下:
..c.o:
gcc -c $<
这个规则表示,所有的 *.o 目标文件都是依赖于相应的 *.c 源文件的, 例如 main.o 依赖于 main.c 。 具体makefile编写方法如下
CC=gcc
main: main.o add_int.o add_float.o sub_int.o sub_float.o
$(CC) -o $@ $^
..c.o:
$(CC) -c $<
clean:
rm -f *.o main
CC=gcc
main: main.o add_int.o add_float.o sub_int.o sub_float.o
$(CC) -o $@ $^
..c.o:
$(CC) -c $<
clean:
rm -f *.o main
8.编译Bug与Debug小结
1、makefile: 4: *** 遗漏分隔符 。 停止 。 错误提示,如下图
分析与处理: 以上错误提示,说明makefile文件第4行,分隔符格式不正确,导致错误。错误详见下图
从上图可见,第4行为command命令行,应该如上述方法2中强调所说,命令行应当Tab分隔缩进 ,解决后如下图所示:
2、make: main 是最新的。 错误提示,如下图
这是因为该文件目录中,已经存在了目标可执行文件 main ,请见下图
解决办法:输入 rm main 或者 rm -f main 命令,先删去 main 文件,然后再输入 make 命令,进行编译链接即可
编译链接成功后,直接利用 ./main 运行生成的目标可执行文件即可啦 ^_^