一、一个简单的例子
创建一个malefile文件如下:
mainapp: main.o 1.o 2.o
gcc -o mainapp main.o 1.o 2.o
mian.o: main.c a.h
gcc -c main.c
1.o: 1.c a.h b.h
gcc -c 1.c
2.o: 2.c b.h c.h
gcc -c 2.c
mainapp应用程序依赖main.o、1.o、2.o,依次类推main.o依赖main.c、a.h等等。
根据依赖关系进行编译。如果你的makefile的名字不是malefile或者Makefile,就需要加入编译选项-f。如:make -f Makefile1
二、使用makefile宏
同样扩展如上的makefile例子如下:
1 all: mainapp
2
3 CC = gcc
4
5 #DEBUG
6 CFLAGS = -I. -g -Wall -ansi
7
8 #Release
9 #CFLAGS = -I. -O -Wall -ansi
10
11 mainapp: main.o 1.o 2.o
12 $(CC) -o mainapp main.o 1.o 2.o
13 main.o: main.c a.h
14 $(CC) $(CFLAGS) -c main.c
15 1.o: 1.c a.h b.h
16 $(CC) $(CFLAGS) -c 1.c
17 2.o: 2.c b.h c.h
18 $(CC) $(CFLAGS) -c 2.c
这种宏的的处理方式与C语言的类似,当然make命令内部也内置了一些特殊的宏定义,百度一下就可以了。
三、makefile中内嵌shell脚本,编译执行文件到指定目录
还是扩展二的例子如下:
1 all: mainapp
2
3 CC = gcc
4
5 INSTALLDIR = bin
6
7 #DEBUG
8 CFLAGS = -I. -g -Wall -ansi
9
10 #Release
11 #CFLAGS = -I. -O -Wall -ansi
12
13 mainapp: main.o 1.o 2.o
14 $(CC) -o mainapp main.o 1.o 2.o
15 main.o: main.c a.h
16 $(CC) $(CFLAGS) -c main.c
17 1.o: 1.c a.h b.h
18 $(CC) $(CFLAGS) -c 1.c
19 2.o: 2.c b.h c.h
20 $(CC) $(CFLAGS) -c 2.c
21
22 clean:
23 -rm mainapp main.o 1.o 2.o #忽略rm的执行结果
24 install:
25 @if [ -d $(INSTALLDIR) ]; \
26 then \
27 cp mainapp $(INSTALLDIR); \
28 chmod a+x $(INSTALLDIR)/mainapp; \
29 echo "Installed in $(INSTALLDIR)"; \
30 else \
31 echo "the $(INSTALLDIR) doesn't exist, please check!";\
32 fi
以上分别提供了debug和release版本。内嵌shell脚本中每行结束需要以\结尾,这是要把shell脚本连接成一行。并且需要注意\的格式,之气在vim上编写的时候,由于有几个\没有显示高亮导致载编译的时候无法判断到shell脚本连接为一行,导致程序编译不过,查了好长时间,网上有的说是unix的编码格式问题,但是试了也没用。所以在编写的时候一定要注意。
使用install和clean两个目标,一个用于安装,一个用于删除所有的.o文件。
make -f Makefile3 clean 和 make -f Makefile3 install。