一个简单的makefile编写(gcc)

一个简单的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$