重新学习makefile

今天回顾了一下makefile,做下笔记;

首先准备几个简单的文件

add.c  head.h  main.c mul.c  sub.c

然后第一版 makefile

app:sub.c add.c mul.c main.c             

    gcc main.c sub.c add.c mul.c -o app  

然后第二版:

app:add.o sub.o main.o mul.o            
    gcc sub.o add.o mul.o main.o -o app 
                                        
sub.o:sub.c                             
    gcc -c sub.c -o sub.o               
add.o:add.c                             
    gcc -c add.c -o add.o               
mul.o:mul.c                             
    gcc -c mul.c -o mul.o               
main.o:main.c                           

    gcc -c main.c -o main.o      


然后第三版:

makefile 的语法跟shell 很像 

src = add.c main.c mul.c sub.c    
obj = add.o sub.o mul.o main.o    
                                
app:$(obj)                        
    gcc $(obj) -o app             
                                  
sub.o:sub.c                       
    gcc -c sub.c -o sub.o         
add.o:add.c                       
    gcc -c add.c -o add.o         
mul.o:mul.c                       
    gcc -c mul.c -o mul.o         
main.o:main.c                     
    gcc -c main.c -o main.o       
                                  
clean:                            

    rm -rf $(obj) app           

第四版:

目标:依赖 

    (tab)条件

$@:表示规则中的目标 

$<:表示规则中的第一个条件 

$^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项

  src = add.c main.c mul.c sub.c  
obj = add.o sub.o mul.o main.o  
                                
ALL:app                         
                                
app:$(obj)                      
    gcc $^ -o $@                
                                
sub.o:sub.c                     
    gcc -c $<  -o $@            
add.o:add.c                     
    gcc -c $<  -o $@            
mul.o:mul.c                     
    gcc -c $<  -o $@            
main.o:main.c                   
    gcc -c $<  -o $@            
                                
clean:                          

    rm -rf $(obj) app       


第五版:

src = $(wildcard *.c) 找到当前目录下所有后缀为.c的文件,赋值给src 

obj = $(patsubst %.c,%.o, $(src)) 把src变量里所有后缀为.c的文件替换成.o

 src = $(wildcard *.c)             
                                   
 obj = $(patsubst %.c, %.o, $(src))
                                   
                                   
 app:$(obj)                        
     gcc $^ -o $@                  
 %.o:%.c                           
     gcc -c $< -o $@               
                                   
                                   
 clean:                            
     rm -rf $(obj) app             
                                   
 .PHONY: clean                         

       



你可能感兴趣的:(重新学习makefile)