一个简单的makefile编写(gcc)
Makefile文件在一定程度上加快了开发进程,在linux下编程makefile的使用时必不可少的。
先上代码,代码很简单就是两个int 数比较大小然后打印出比较大的那个,我们主要学习makefile的编写。
Main.c :
#include "max.h"
int main()
{
int a = 10;
int b = 20;
int c =0;
c =max(a,b);
printf("c =%d\n",c);
return 0;
}
Max.h:
#ifndef MAX_H
#define MAX_H
#include "stdio.h"
int max(int a,int b);
#endif
Max.c:
#include "max.h"
int max(int a,int b)
{
int c;
if(a>b)
c =a;
else
c =b;
}
如果没有makefile文件正常流程为:
gcc -c max.c -o max.o
gcc -c main.c -o main.o
gcc main.o max.o -o max
./max
程序代码模块如果很多,一条一条编译效率很低,所以这时makefile就派上了大用场。
编写makefile时有一定的规则:
目标(target) :需要的条件(dependencies) (注意冒号两边有空格)
命令(system command) (注意前面用tab键开头)
解释:
1 目标可以是一个或多个,可以是Object File,也可以是执行文件,甚至可以是一个标签。
2 需要的条件就是生成目标所需要的文件或目标
3 命令就是生成目标所需要执行的脚本
总结一下,就是说一条makefile规则规定了编译的依赖关系,也就是目标文件依赖于条件,生成规则用命令来描述。在编译时,如果需要的条件的文件比目标更新的话,就会执行生成命令来更新目标。
Makefile:
OBJS = main.o max.o
main: $(OBJS)
gcc $(OBJS) -o max #Tab
main.o: main.c max.h
gcc -c main.c -o main.o
max.o: max.c max.h
gcc -c max.c -o max.o
clean:
rm -rf *.o max
上面的makefile文件中执行四条指令:
第一:
main: $(OBJS) #main依赖于main.o max.o
(tab)gcc $(OBJS) -o main #命令行,前面必须为tab,编译出main可执行文件。-o表示你指定 的目标文件名。
第二:
main.o: main.c max.h #main.o依赖于main.c max.h
gcc -c main.c -o main.o 编译出file1.o文件。-c表示gcc 只把给它的文件编译成目标文件, 用源码文件的文件名命名但把其后缀由“.c”变成“.o”。在这句中,可以省略-o file1.o,编译器默认生成file1.o文件,这就是-c的作用。
第三:
max.o: max.c max.h #与第二类似
gcc -c max.c -o max.o
第四:
clean:
rm -rf *.o max
当用户键入make clean命令时,会删除*.o 和max文件。
写好makefile,在终端里面直接键入make就会执行makefile中的指令了:
ubuntu:~/C/CEX/ex1$ ls
main.c makefile max.c max.h
ubuntu:~/C/CEX/ex1$ make
gcc -c main.c -o main.o
gcc -c max.c -o max.o
gcc main.o max.o -o max #Tab
ubuntu:~/C/CEX/ex1$ ls
main.c main.o makefile max max.c max.h max.o
ubuntu:~/C/CEX/ex1$ ./max
c =20
ubuntu:~/C/CEX/ex1$ ls
main.c main.o makefile max max.c max.h max.o
ubuntu:~/C/CEX/ex1$ make clean
rm -rf *.o max
ubuntu:~/C/CEX/ex1$