目前为止,Makefile都是执行一些简单的编译工作,这对于软件来说根本无法给用户使用,最终可执行程序以及目标文件都会安装到系统目录当中,这时候Makefile里仅仅只有目标文件的依赖关系和规则远远不够,至少应该还有clean和install
在初学Linux的时候,经常碰到make报错,fix了bug,修改了源代码,但是依旧编译不通过,但是make clean或者make distclean之后再编译就对了,原因就是一些中间文件或者库导致的
make clean一般是来删除目标文件的,比如前面Makefile1里添加clean,然后执行make clean
clean: rm *.o lihui@2015 ~ $ make -f Makefile1 clean rm *.o
执行clean命令,就会删除所有.o文件
假如需要将目标文件copy到系统目录当中,需要的步骤是首先创建目标文件,然后再来执行copy方法的具体规则,实际上执行规则会调用一个shell,添加后完整的Makefile1如下:
lihui@2015 ~ $ cat Makefile1 all: lihui #compiler CC = gcc #install BINDIR = /usr/local/bin #include files INCLUDE = . #development options CFLAGS = -g -O0 #release options #CFLAGS = -O2 -Wall lihui: main.o 1.o 2.o $(CC) -o lihui main.o 1.o 2.o main.o: a.h main.c $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c 1.o: a.h b.h 1.c $(CC) -I$(INCLUDE) $(CFLAGS) -c 1.c 2.o: b.h c.h 2.c $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c clean: rm *.o install: lihui cp lihui.exe $(BINDIR) chmod a+x $(BINDIR)/lihui.exe lihui@2015 ~ $ make -f Makefile1 clean rm *.o lihui@2015 ~ $ make -f Makefile1 gcc -I. -g -O0 -c main.c gcc -I. -g -O0 -c 1.c gcc -I. -g -O0 -c 2.c gcc -o lihui main.o 1.o 2.o lihui@2015 ~ $ make -f Makefile1 install cp lihui.exe /usr/local/bin chmod a+x /usr/local/bin/lihui.exe lihui@2015 ~ $ whereis lihui.exe lihui: /usr/local/bin/lihui.exe
同样,由于是cygwin,将可执行程序后缀.exe也带上了,linux下install里不需要带后缀
其实除了这两个比较普遍的命令,还有一个distclean,之前有写过一片flex的编译,就是由于clean只删除中间库文件,而在编译中还生成了一个中间文件源文件,而这个源文件一直是有问题的,导致一直无法编译通过,这时候就必须看看是否还提供了一个make distclean命令,会删除所有中间文件,达到跟checkout一样或者原始模样,可以搜索一些开源软件看看
最后是一些宏定义的含义
$? 当前目标所依赖的文件列表中比当前目标文件还要新的文件 $@ 当前目标的名字 $< 当前依赖文件的名字 $* 不包括后缀名的当前依赖文件的名字