(一)为什么要编写Makefile
我们自己平常在linux下编译源文件时,当然可以使用gcc -Wall -g main.c -o main这样的命令一个一个编译,但是一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,我们一个个编译是极其花费时间的,也是不可取的。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
(二)Makefile的基本规则我们只需要使用vi Makefile命令创建一个新的Makefile文件,等我们编写好后,只需要使用make 命令就可执行编译操作。这里我们创建两个.c文件,使用他们生成目标文件:
上面是相对简练的写法,我们一个个来解释:
.PHONY:clean OBJECTS=01.o 02.o main:$(OBJECTS) gcc -Wall -g $^ -o $@ 01.o:01.c gcc -Wall -g -c $< -o $@ 02.o:02.c gcc -Wall -g -c $< -o $@ clean: rm -f main $(OBJECTS)
1.SUBDIR=$(shell ls -d */) 使用shell命令,将当前目录下所有的子目录赋给SUBDIR
.PHONY:clean all CC=gcc CFLAGS=-Wall -g BIN=main SUBDIR=$(shell ls -d */) ROOTSRC=$(wildcard *.c) SUBSRC=$(shell find $(SUBDIR) -name '*.c') SUBOBJ=$(SUBSRC:%.c=%.o) $(BIN):$(ROOTOBJ) $(SUBOBJ) $(CC) $(CFLAGS) $(ROOTOBJ) $(SUBOBJ) -o $(BIN) .c.o: $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f *.o $(BIN) $(ROOTOBJ) $(SUBOBJ)
01文件夹下的Makefile CC =gcc BIN =01 OBJS =01.o .PHONY: all clean print all:print $(BIN) print: @echo '----make all in $(PWD)-----' #$(BIN):$(OBJS) # $(CC) $(OBJS) -o $@ %.o:%.c $(CC) -c $< clean: @echo '----make clean in $(PWD)---' rm -f $(BIN) $(OBJS)
02文件夹下的Makefile (这里02文件夹下为.cpp文件) CXX =g++ BIN =02 OBJS =02.o CPPFLAGS =-Wall -g .PHONY: all clean print all:print $(BIN) print: @echo '-----make all in $(PWD)----' $(BIN):$(OBJS) $(CXX) $(CPPFLAGS) $(OBJS) -o $@ %.o:%.cpp $(CXX) -c $< clean: @echo '----make clean in $(PWD)----' rm -f $(BIN) $(OBJS)
文件夹同级目录下的Makefile文件 SUBDIRS =01 02 .PHONY:default all clean $(SUBDIRS) default:all all clean: $(MAKE) $(SUBDIRS) TARGET=$@ $(SUBDIRS): $(MAKE) -C $@ $(TARGET)
上面两个很好理解,最后的这个Makefile文件中,$(MAKE)代表make命令,TARGET默认是第一个即all,$(MAKE) -C(大写)代表进入到01 02的Makefile中,执行参数为TARGET的操作。
当我们执行make clean时,TARGET即为clean
更深入的内容请参考:http://blog.csdn.net/haoel/article/details/2886/
联系客服