转:http://blog.csdn.net/liang13664759/article/details/1771246/
http://blog.csdn.net/nk_test/article/details/48181787
Linux下Makefile快速编写入门
(一)为什么要编写Makefile
我们自己平常在linux下编译源文件时,当然可以使用gcc -Wall -g main.c -o main这样的命令一个一个编译,但是一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,我们一个个编译是极其花费时间的,也是不可取的。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
(二)Makefile的基本规则 Mackfile基本规则 Target ...: Dependencies ... Command ... 说明: 1)目标(TARGET):即最终想要产生的文件,如:可执行文件,目标文件或中间文件等;目标也可以是要执行的动作,如clean,也称为伪目标(用.PHONY指定伪目标)。 2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。 3)命令(COMMAND):是make执行的动作(shell命令或是可在shell下执行的程序,如echo)。注意:每个命令行的起始字符必须为TAB字符! 如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容。 (三)简单Makefile的编写 1.单级目录下的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)
- .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/