如何编写Makefile?

//swap.c
#include<stdio.h>
int swap(int *x,int *y)
{printf("a=%d b=%d\n",*x,*y);
 int z;
 z=*x;
 *x=*y;
 *y=z;
 printf("a=%d b=%d\n",*x,*y);
}
//max.c
int max(int a,int b)
{
 return a>b?a:b;
}
//test.c
int main()
{
  int x=3,y=4;
  printf("max=%d\n",max(x,y));
  swap(&x,&y);
 }

下来咱们来编写Makefile文件
vi Makefile //文件名必定要为Makefile,不能是其余任何名字,标准为Makefile,书上写的是makefile
all:test//all也能够改成其余任何名字
max.o:max.c
    gcc -o max.o -c max.c//最前面是个TAB键,固定格式不能修改的!!!
swap.o:swap.c
    gcc -o swap.o -c swap.c
test.o:test.c
    gcc -o test.o -c test.c
test:max.o swap.o test.o
    gcc -o test swap.o max.o test.o

编写Makefile时,最好用vi编辑器,不可用记事本gedit,不然会出现以下错误的!!!!
接着昨天的写



touch能够修改文件的时间!能够看出如今swap.c的时间大于swap.o的时间!

make的原理
1:makefile怎么知道了哪一个文件被修改了
根据时间判断哪一个文件被修改了
make如何知道那个.c文件被修改了,而后只从新单独编译此文件,其余没有修改的文件不会被再次编译,

若是只修改了某个.o文件,只作连接,这节省了好多时间的啊!!一句话只要作了修改,最后的的连接是必不可少的!!!
2:makefile文件是如何执行的呢?
exe:test
max.o:max.c
    gcc -o max.o -c max.c
swap.o:swap.c
    gcc -o swap.o -c swap.c
test.o:test.c
    gcc -o test.o -c test.c
test:max.o swap.o test.o
    gcc -o test swap.o max.o test.o
[root@linux Makefile_example]# 
若是没有.o文件的话,那么就所有执行上面的全部操做!
若是已经make后,再次修改某个.o或者.c文件而后用他们的时间进行比较,若是.o文件的时间小于.c文件的时间,说明.c文件被修改过,那么就执行gcc -o xxx.o -c xxx.c这句
接着执行gcc -o test swap.o max.o test.o这句!
还有一个问题那就是为神魔要开头的这一句呢!exe:test
由于如图:

test至关于main函数max.o swap.o test.o至关于调用函数!函数调用完毕后返回调用函数处,接着调用下一个函数;好像也能够不用最上面的exe:test,可是要把下面的语句放在最上面才能够!!!
test:max.o swap.o test.o
   gcc -o test swap.o max.o test.o

 今天老师又讲了另外一种方法来编写Makefiellinux

咱们来看下编辑器

//文件名为Makefile函数

EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)//这句两句必定要放在这儿,不能放在后面那三
$(CC) -o $(EXEC) $(OBJS)
max.o:max.c
$(CC) -o max.o -c max.c
swap.o:swap.c
$(CC) -o swap.o -c swap.c
test.o:test.c
$(CC) -o test.o -c test.cspa

 

 

从新写Makefile文件3d

EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)
$(CC) -o $@ $^
max.o:max.c
$(CC) -o $@ -c $<
swap.o:swap.c
$(CC) -o $@ -c $^
test.o:test.c
$(CC) -o $@ -c $^ code

执行状况同上,就不截图了啊!!!blog

 从新写Makefileit

EXEC=test
OBJS=test.o swap.o max.o
CC=gcc
$(EXEC):$(OBJS)
$(CC) -o $@ $^
%.o:%.c
$(CC) -o $@ -c $<
cleal:
rm *.o $(EXEC)io

执行状况以下:编译

从新写Makefile

 

EXEC=/usr/bin/www  把可执行文件放在

任意一个系统默认的路径里,就能够只用文件名来执行,而不用像之前那样输入./test;

为何我这儿要将EXEC=/usr/bin/test换为www由于若是不换不能在任意目录经过文件名来执行,可是能够经过绝对路径来执行(/usr/bin/test),我估计之前我建立

了test在上述路径的目录里,因此可能执行了之前的,没有执行此次的二进制文件!!!

相关文章
相关标签/搜索