Makefile编写

makefile文件
转自:http://www.cnblogs.com/azraelly/archive/2012/12/23/2830096.html

  1.实例:makefile.bak


.PHONY:clean
 #显式指定clean 为伪目标,防止在当前目录下存在clean文件是无法执行清理工作
ping:ping.o main.o
        g++ -Wall -g  main.o ping.o -o ping -lpthread
ping.o:ping.cpp ping.h
        g++ -Wall -g -c ping.cpp -o ping.o
main.o:main.cpp
        g++ -Wall -g -c main.cpp -o main.o
clean:


   echo begin delete ...
        rm -f *.o




  2.makefile自动化变量makefile   


.PHONY:clean  


#显式指定clean 为伪目标,防止在当前目录下存在clean文件是无法执行清理工作 


OBJECTS=ping.o main.o 


ping:$(OBJECTS)                                #自定义变量


  g++ -Wall -g  $^ -o $@ -lpthread      #$^ 依赖列表的所有项ping.o main.o  $@ 表示目标项ping


ping.o:ping.cpp ping.h      


   g++ -Wall -g -c $< -o $@                  #$<依赖列表的第一项ping.cpp


main.o:main.cpp       


  @g++ -Wall -g -c $< -o $@                   #在命令前加@,表示不显示命令


clean:         rm -f $(OBJECTS)


#自动化变量和自定义变量的使用


makefile的执行:make clean -f makefile.bak   -f 指定要执行的makefile文件


 


  3.makefile默认推导规则


实例:


生成多个可执行文件


01Test.cpp 02Test.cpp    


.PHONY:clean all


BIN=01Test 02Test


all:$(BIN)


clean:


  rm -f $(BIN)


执行后生成01Test 02Test可执行文件,系统执行的事隐含推导规则,也可以自己编写推导规则


模式规则:%.o:%.c


01Test.cpp 02Test.cpp   


.PHONY:clean all
BIN=01Test 02Test
all:$(BIN)
%.o:%.c
       g++ -Wall -g -c $< -o $@
01Test:01Test.o
        g++ -Wall -g $^ -o $@
02Test:02Test.o
        g++ -Wall -g $^ -o $@
clean:
        rm -f *.o $(BIN)


 


 


后缀规则:.c.o:


.PHONY:clean all
BIN=01Test 02Test
all:$(BIN)
.c.o:
       g++ -Wall -g -c $< -o $@
01Test:01Test.o
        g++ -Wall -g $^ -o $@
02Test:02Test.o
        g++ -Wall -g $^ -o $@
clean:
        rm -f *.o $(BIN)


 


定义变量进一步简化makefile:


.PHONY:clean all


CC=g++


CFLAGS=-Wall -g
BIN=01Test 02Test
all:$(BIN)
.c.o:
       $(CC)  $(CFLAGS) -c $< -o $@
01Test:01Test.o
        $(CC) $(CFLAGS) $^ -o $@
02Test:02Test.o
         $(CC) $(CFLAGS) $^ -o $@
clean:
        rm -f *.o $(BIN)


多级目录makefile的实现:
    1.make常用内嵌函数
   2.二级目录的实现
实例
.PHONY:clean 
 #显式指定clean 为伪目标,防止在当前目录下存在clean文件是无法执行清理工作
 CC    =g++ CFLAGS =-Wall -g 
BIN = ping SUBDIR =$(shell ls -d */) 
ROOTSRC =$(wildcard *.cpp)   #当前目录下匹配模式的文件 
ROOTOBJ =$(ROOTSRC:%.cpp=%.o) 
SUBSRC =$(shell find $(SUBDIR) -name '*.cpp')  #指定目录下的源文件 
SUBOBJ =$(SUBSRC:%.cpp=%.o)    #模式替换函数
$(BIN):$(ROOTOBJ) $(SUBOBJ) 
   $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ) -lpthread 
.c.o:  
  $(CC) $(CFLAGS) -c  $< -o $@
clean: 
   @rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)


#二级目录makefile文件的使用 
      3.多级目录、多个makefile的实现


 




SUBDIRS = Test1 Test2
.PHONY:default all clean $(SUBDIRS)
default:all
all clean:
 $(MAKE) $(SUBDIRS) TARGET=$@
$(SUBDIRS):
 $(MAKE) -C $@ $(TARGET)             
 #-C表示进入到目录 make -C Test1 all等价于make all Test1/makefile


Test1目录makefile
CC = g++
BIN = Test1
OBJS = Test1.o
.PHONY: all clean print
all:print $(BIN)
print:
 @echo "-----------make all in $(PWD) -----------"
$(BIN):$(OBJS)
 $(CC) $(OBJS) -o $@
%.o:%.cpp
 $(CC) -c $<
clean:
 @echo "-----------make clean in $(PWD) -----------"
 rm -f $(BIN) $(OBJS)


Test2目录的makefile
CC = g++
BIN = Test2
OBJS = Test2.o
CFLAGS = -Wall -g
.PHONY: all clean print
all:print $(BIN)
print:
 @echo "-----------make all in $(PWD) -----------"
$(BIN):$(OBJS)
 $(CC) $(CFLAGS) $(OBJS) -o $@
%.o:%.cpp
 $(CC) $(CFLAGS) -c $<
clean:
 @echo "-----------make clean in $(PWD) -----------"
 rm -f $(BIN) $(OBJS)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值