• [Makefile]多目录Makefile写法


    最近需要写一个测试程序,这个测试程序需要集成一些功能,写在同一个文件看上去很不好,多个文件的Makefile又不是很熟,于是分享下面这篇文章

    先介绍下,调试Makefile时,想知道某个变量的值,怎么办,在该变量下方加入:

    $(shell echo $(VAR) > a.txt)

    转自:http://blog.csdn.net/yuzhihui_no1/article/details/44810357

      前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写;

            在做项目时,一般文件都会分几个目录来存放;基本的是  include/  bin/ src/ obj/ lib/ tools/,这几个文件;我先说下我的文件存放目录,用ls -R可以查看到所有文件:./include/common.h    ./src/main.c    ./src/printStatus.c  就三个文件,其中*.c 文件都依赖于 *.h文件;

            同样的先上第一版makefile:

    [cpp] view plain copy
     
    1. CC=gcc  
    2. objects=obj/main.o obj/printStatus.o  
    3.   
    4. bin/main:$(objects)  
    5.    $(CC) -o bin/main $(objects)  
    6.   
    7. obj/main.o:src/main.c include/common.h  
    8.    $(CC) -o obj/main.o -c src/main.c -Iinclude  
    9.   
    10. obj/printStatus.o:src/printStatus.c include/common.h  
    11.    $(CC) -o obj/printStatus.o -c src/printStatus.c -Iinclude  
    12.   
    13. clean:  
    14.    rm -rf $(objects) bin/main  

            上面的makefile就是gcc命令的拼凑起来的,下面来分享下比较通用的多目录下的makefile;

     

            在看多目录的makefile时,先来理解下几个函数和变量;

    函数:

            wildcard 这是扩展通配符函数,功能是展开成一列所有符合由其参数描述的文 件名,文件间以空格间隔;比如:罗列出src下的所有.c文件:$(wildcard ${SRC}/*.c)

            patsubst 这是匹配替换函数, patsubst ( 需要匹配的文件样式,匹配替换成什么文件,需要匹配的源文件)函数。比如:用src下的*.c替换成对应的 *.o文件存放到obj中:$(patsubst  %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))

            notdir 这是去除路径函数,在上面patsubst函数中已经使用过,去除SOURCE中文件的所有目录,只留下文件名;

     

    变量:

            $@:表示目标文件;一般是在规则中这么用:gcc  -o $@  $(object);

            $^:表示所有依赖文件;一般是在规则中这么用:gcc -o $@  $^  ;用所有依赖文件链接成目的文件;

            $<:表示第一个依赖文件;在规则中使用:gcc -o $@ -c $< ;其实这个时候就是每个依赖文件生成一个目的文件;

     

    第二版makefile

     

    [cpp] view plain copy
     
    1. #把所有的目录做成变量,方便修改和移植   
    2. BIN = ./bin  
    3.  SRC = ./src  
    4.  INC = ./include  
    5.  OBJ = ./obj  
    6.    
    7. #提前所有源文件(即:*.c文件)和所有中间文件(即:*.o)  
    8.  SOURCE = $(wildcard ${SRC}/*.c)  
    9.  OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE}))  
    10.    
    11. #设置最后目标文件  
    12.  TARGET = main  
    13.  BIN_TARGET = ${BIN}/${TARGET}  
    14.    
    15.  CC = gcc   
    16.  CFLAGS = -g -Wall -I${INC}   
    17.    
    18. #用所有中间文件生成目的文件,规则中可以用 $^替换掉 ${OBJECT}  
    19.  ${BIN_TARGET}:${OBJECT}  
    20.      $(CC) -o $@ ${OBJECT}  
    21.    
    22. #生成各个中间文件  
    23.  ${OBJ}/%.o:${SRC}/%.c   
    24.      $(CC) $(CFLAGS) -o $@ -c $<  
    25.    
    26.  .PHONY:clean  
    27.  clean:  
    28.      find $(OBJ) -name *.o -exec rm -rf {} ; #这个是find命令,不懂的可以查下资料  
    29.      rm -rf $(BIN_TARGET)  

            这个makefile的好处就是通用性,里面不涉及到具体的文件名,当你往src目录中添加新文件时,可以不需要修改makefile,所以这是个非常好的工具;

     

  • 相关阅读:
    linux 内核配置
    使用 git 下载linux 源码
    订阅 linux 邮件列表注意的问题
    使用反射创建一维数组和二维数组
    反射API
    反射机制
    集合案例--对ArrayList容器中的内容进行排序
    Collections
    TreeSet
    Set容器
  • 原文地址:https://www.cnblogs.com/aaronLinux/p/7077016.html
Copyright © 2020-2023  润新知