多个目标

目前为止,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一样或者原始模样,可以搜索一些开源软件看看

最后是一些宏定义的含义

$?	当前目标所依赖的文件列表中比当前目标文件还要新的文件
$@	当前目标的名字
$<	当前依赖文件的名字
$*	不包括后缀名的当前依赖文件的名字

发表回复