• 代码片段--Makefile之大型工程项目子目录Makefile的一种通用写法


    转载:http://blog.csdn.net/mo_hui123456/article/details/8929615

    管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功倍的效果,本文描述Linux环境下大型工程项目子目录Makefile的一种通用写法,使用该方法,当该子目录内的文件有增删时无需对Makefile进行改动,可以说相当的智能。下面先贴代码(为减小篇幅,一些非关键的代码被去掉):

    ROOTDIR = .
    
    EXE_DIR = ./bin
    CFLAGS = -I$(INCLUDE_DIR) -I$(LIB_INC) -Wall
    LFLAGS = -L$(LIB_DIR)
    
    objects := $(patsubst %.c,%.o,$(wildcard *.c))
    executables := $(patsubst %.c,%,$(wildcard *.c))
    
    $(objects) : %.o: %.c
        $(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
    all : $(executables)
    $(executables) : $(objects)
        @mkdir -p ./bin$
        (CROSS_COMPILE)gcc $(CFLAGS) $< -o $(EXE_DIR)/$@ $(LFLAGS) $(LIBS)
    clean:
        @rm -f *.o rm -f ./bin/* 
        @rm -rf ./bin 
    distclean: clean

    假如当前目录里面有a.c b.c两个文件

     

           Makefile 里的函数跟它的变量很相似——使用的时候,你用一个$符号跟左圆括号,函数名,空格后跟一列由逗号分隔的参数,最后用右圆括号结束。例如,在 GNU Make里有一个叫'wildcard' 的函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。像这个命令: 

    objects= $(wildcard *.c)

         会产生一个所有以'.c' 结尾的文件列表(本例结果为a.c b.c),然后存入变量 objects里。    

       另一个有用的函数是 patsubst ( patten substitude,匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要处理由空格分隔的序列。我们将两个函数合起来用:

    objects := $(patsubst %.c,%.o,$(wildcard *.c))

     会被处理为:

    objects := a.o b.o

    同理:

    executables := $(patsubst %.c,%,$(wildcard *.c))

     会被处理为:

    executables := a b

    %o:所有以“.o”结尾的目标,也就是a.o b.o

    依赖模式“%.c”:取模式“%.o”的%,也就是foo bar,并为其加上.c后缀,即a.c,b.c

     $<:表示所有依赖目标集,也就是a.c b.c

    $@:表示目标集,也就是a.o b.o

    命令前加@,表示在终端中不打印,如@mkdir -p ./bin

     

    $(objects) : %.o: %.c 
           $(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@

     

    即可翻译为:

     

    a.o b.o : a.c b.c
           $(CROSS_COMPILE)gcc -c  $(CFLAGS)  (a.c b.c) -o (a.o b.o)

     

    明白了这些,这种Makefile的写法就可以完全掌握了。

  • 相关阅读:
    outer的使用
    MySQL按天,按周,按月,按时间段统计
    使用@JsonFormat引起的时间比正常时间慢8小时解决方法
    CPU上下文切换的次数和时间(context switch)
    Spring Controller 获取请求参数的几种方法
    MySQL 5.7 跟踪优化器
    tomcat 配置https
    Tomcat启动时项目重复加载,导致资源初始化两次的问题
    JSP中文乱码问题终极解决方案
    ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3608013.html
Copyright © 2020-2023  润新知