Makefile

来源:互联网 发布:全站简繁体转换js代码 编辑:程序博客网 时间:2024/06/05 15:30

查看帮助一是man make,二是进入www.gnu.org,找到make的帮助文档(更详细)。

一、Makefile的格式如下:

       目标/伪目标:依赖/伪依赖

               命令(前面必须加上tab键)

       BIN是用户自定义变量,CC ,CFLAGS是预定义变量,$* 不包括扩展名的目标文件 $< 第一个依赖文件的名称  $@ 目标文件 $^ 所有不重复的依赖文件,这些是自动变量和环境变量。

       .PHONY :说明这些是make的命令。

       执行make 目标/伪目标,就是为了生成目标/伪目标。如果Makefile中没有加.PHONY: clean,如果此时当前目录下正好有clean文件,执行make clean时,系统会认为已经生成了clean文件,所以不会再执行Makefile中的clean。


二、Makefile四种使用方式

       1、文件分布在同一目录下,只有一个Makefile

       | -- Makefile

       | -- main.c(包括main函数,其余为空)

       | -- add.c

       | -- sub.c

       | -- add.h

       | -- sub.h

       Makefile代码如下:

.PHONY:cleanCC=gccCFLAGS=-Wall -gOBJECTS=main.o add.o sub.omain:$(OBJECTS)$(CC) $(CFLAGS) $^ -o $@main.o:main.c$(CC) $(CFLAGS) -Wall -g -c $< -o $@add.o:add.c add.h$(CC) $(CFLAGS) -Wall -g -c $< -o $@sub.o:sub.c sub.h$(CC) $(CFLAGS) -Wall -g -c $< -o $@clean:rm -f main $(OBJECTS)

       make执行后,默认make main,依次寻找依赖文件,如果只改动了sub.c,那么其他的不会重新编译。只会执行gcc -Wall -g sub.c -o sub.o gcc -Wall -g main.o sub.o add.o -o main。代码上面7到12行,可以替换为以下代码:

%.o:%.c $(CC) $(CFLAGS) -c $< -o $@

       2、文件分布在不同目录下,只有一个Makefile

       | -- Makefile

       | -- main.c(包括main函数,其余为空)

       | -- bll/

       |       | -- bll.c

       |       | -- bll.h

       | -- dal/

       |       | -- dal.c

       |       | -- dal.h

       | -- ui/

       |       | -- ui.c

       |       | -- ui.h

       Makefile代码如下:

CC      = gccCFLAGS  =-Wall -gBIN     = mainSUBDIR  = $(shell ls -d */) #结果为/bll /dal /uiROOTSRC = $(wildcard *.c)  #结果为main.cROOTOBJ = $(ROOTSRC:%.c=%.o) #结果为main.oSUBSRC  = $(shell find $(SUBDIR) -name '*.c') #结果为bll.c dal.c ui.cSUBOBJ  = $(SUBSRC:%.c=%.o) #结果为bll.o dal.o ui.o$(BIN):$(ROOTOBJ) $(SUBOBJ)$(CC) $(CFLAGS) $(ROOTOBJ) $(SUBOBJ) -o $(BIN)%o:%.c$(CC) $(CFLAGS) -c $< -o $@clean:rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)

       3、文件分布在不同目录下,多个Makefile

       | -- Makefile

       | -- test1/

       |       | -- Makefile

       |       | -- tes1.c(包括main函数)

       | -- test2/

       |       | -- Makefile

       |       | -- tes2.c(包括main函数)

       根目录下Makefile代码如下:

SUBDIRS = test1 test2.PHONY:default all clean $(SUBDIRS)default:allall clean:$(MAKE) $(SUBDIRS) TARGET=$@ #make test1 test2 TARGET=all(传递参数),此句话为了生成test1,test2伪目标,所以调用了$(SUBDIRS)$(SUBDIRS):$(MAKE) -C $@ $(TARGET) #make -C test1 test2 all 执行tes1和test2目录下的Makefile,而且是all伪指令

          test1/中Makefile代码如下:

CC      = gccBIN     = test1OBJS    = test1.o.PHONY: all clean printall:print $(BIN)print:@echo "----- make all in $(PWD) -----"#@表示不输出此行$(BIN):$(OBJS)$(CC) $(OBJS) -o $@%.o:%.c$(CC) -c $< -o $@clean:@echo "----- make clean in $(PWD) -----"rm -f $(BIN) $(OBJS)
         test2/中Makefile代码如下:

CXX       = g++BIN       = test2OBJS      = test2.oCPPFLAGS  = -Wall -g.PHONY: all clean printall:print $(BIN)print:@echo "----- make all in $(PWD) -----"$(BIN):$(OBJS)$(CXX) $(OBJS) -o $@.o:%.cpp$(CXX) -c $< -o $@clean:@echo "----- make clean in $(PWD) -----"rm -f $(BIN) $(OBJS)


原创粉丝点击