Linux makefile讲解
博客不会讲解的太细致深入,推荐先看视频再看博客
视频链接,推荐去B站观看,B站比较清晰...
土豆网:http://www.tudou.com/programs/view/19VZ0f3b_I0
B站: http://www.bilibili.com/video/av9655080/
在linux中编译.c文件的时候,可以用gcc命令,当然了,如果是100个.c文件你怎么办?这个时候你最好创建一套规则来使用,这时我们就用到了makefile,一切东西的发明创造都是为了方便。
现在我有一个.c文件叫test.c,内容如下:
#include <stdio.h> void main() { printf("hello wold! \n"); }
然后嘞,我用makefile来搞定它!(注意这是在同一个目录下的哦)
test:test.o //目标:依赖关系 gcc test.o -o test //注意!这里的是tab键,不是空格,不打tab键会出错的 test.o:test.c gcc -c test.c -o test.o clean: rm *.o test
这就是一个最简单的makefile啦,执行的时候只需要make一下就ok了 (如果你看不懂就去看我的视频,我会讲解为什么要这么写)
看过上面的例子之后可能有人会说makefile的优越性在哪?别急,下面我们来6个.c文件,分别是 m.c m.h visit.c play.c listen.c watch.c study.c
m.c
#include <stdio.h> void main() { int i; printf("please input the value of i from 1 to 5 :\n"); scanf("%d",&i); if(i==1) visit(); else if(i==2) study(); else if(i==3) play(); else if(i==4) watch(); else if(i==5) listen(); else printf("nothing to do \n"); printf("This is a woderful day\n"); }
study.c
#include <stdio.h> void main() { void study() { printf("study embedded system today \n"); } }
listen.c
#include <stdio.h> void main() { void listen() { printf("listen english today \n"); } }
play.c
#include <stdio.h> void main() { void study() { printf("play football today \n"); } }
visit.c
#include <stdio.h> void main() { void study() { printf("visit friend today \n"); } }
watch.c
#include <stdio.h> void main() { void watch() { printf("watch TV today \n"); } }
我是不是写了一个m.h文件?这个叫头文件,也叫引用文件,因为m.c里面用了visit(),play()...方法,所以我们也来写一下m.h
void visit(); void listen(); void watch(); void study(); void play();
这里列举了6个.c文件和一个.h文件,现在我们来写makefile
CC=gcc TARGET=ALL OBJECTS=m.o visit.o listen.o watch.o study.o play.o $(TARGET):$(OBJECTS) $(CC) $(OBJECTS) -o m m.o:m.c m.h //这里m.o和m.h一起 $(CC) -c m.c -o m.o visit.o:visit.c $(CC) -c visit.c -o visit.o listen.o:listen.c $(CC) -c listen.c -o listen.o watch.o:watch.c $(CC) -c watch.c -o watch.o study.o:study.c $(CC) -c study.c -o study.o play.o:play.c $(CC) -c play.c -o play.o clean: rm *.o m
这个应该很好懂的,最后嘞,我介绍一下怎么使用变量来简化操作
CC=gcc TARGET=ALL OBJECTS=m.o visit.o listen.o watch.o study.o play.o $(TARGET):$(OBJECTS) $(CC) $(OBJECTS) -o m m.o:m.c m.h $(CC) -c m.c -o m.o *.o:*.c // *可以代替目标名称,因为依赖和目标名一样,所以都可以用*来代替 $(CC) -c $< -o $@ // $<的意思是依赖,$@的意思是目标 clean: rm *.o
makefile呢分为在同一个文件下面和不同一个文件下面,我只讲了在同一个文件下面,那个大家自己去查也很简单,就酱~