zoukankan      html  css  js  c++  java
  • makefie文件的基本说明和使用

    1. Makefile的三要素(构成一个规则):
    目标:依赖 //目标在前,依赖在后,分号分开
    命令 //命令前面一个tab缩进
    2. 举例说明:
    cal:add.c sub.c #直接依赖.c文件
    gcc -c add.c sub.c -o cal
    3. 举例说明拆分演进
    cal:add.o sub.o #改为依赖.o文件
    gcc add.o sub.o -o cal
    add.o:add.c #.o文件依赖.c文件
    gcc -c add.c #gcc -c生成add.o文件
    sub.o:sub.c #.o文件依赖.c文件
    gcc -c sub.c #gcc -c生成sub.o文件
    4. 总结
    最终目标写在第一条,比如上面的拆分演进里,目标cal写在第一条,最终目标依赖的东西如果存在,则直接执行,如果不存在,再往下查找依赖,以此类推。
    从上往下查找依赖,以此类推,树状结构。
    从下往上执行命令,最终生成第一条的终极目标。
    附:是否重新执行命令(编译),是比较各个目标和自身依赖的时间来确定的(包括最终目标和各个子目标)。正常情况目标是要比依赖晚的,因为目标是由依赖生成的嘛,如果依赖修改了,那依赖的时间就比目标的晚了,那就要重新编译了。
    5. 使用Makefile的变量
    obj=add.o sub.o #自定义变量
    target=cal #自定义变量
    $(target):$(obj) #这里的$(自定义变量) 表示引用自定义变量
    gcc $(obj) -o $(target)
    %.o:%.c #模式匹配使用%,比如$(obj)匹配后变为add.o:add.c,sub.o:sub.c
    gcc -c $< -o $@ #变量$<表示规则里的第一个依赖(比如add.o:add.c规则里的第一个依赖就是add.c,当然这个规则本身就只有一个依赖),$@表示规则里的目标
    6. 使用Makefile的变量
    obj=add.o sub.o
    target=cal
    $(target):$(obj)
    $(CC) $^ -o $@ #变量CC是Makefile的预定义变量,默认值是cc,也就是gcc, $^表示规则里的所有依赖
    %.o:%.c
    $(CC) -c $< -o $@ #变量$<,$@,$^称为自动变量,只能在规则里的命令里面使用
    7. Makefile的函数使用
    src=$(wildcard ./*.c) #wildcard是函数名,./*.c是函数参数,这里表示当前目录下的所有.c文件,多个参数之间使用逗号分开,$表示取值;整体就是查找当前目录下的所有.c文件
    obj=$(patsubst ./%.c, ./%.o, $(src)) //字符串替换,替换名称.c为.o,%是通配符
    target=cal
    $(target):$(obj)
    $(CC) $^ -o $@
    %.o:%.c
    $(CC) -c $< -o $@
    其他函数:$(subst FROM,TO,TEXT),$(patsubst PATTERN,REPLACEMENT,TEXT),$(strip STRINT),$(findstring FIND,IN)等等,更多可参考GNU make手册
    8.make clean
    .PHONY:clean #声明伪目标,这样就不会比较目标时间了,防止当前目录下刚好有一个clean文件,误当作目标拿来比较,从而提示你clean是最新的,而不执行clean操作
    clean: #没有依赖的情况
    rm -f $(obj) $(target) #删除当前目录下的.o文件和cal文件
    执行:make clean #执行时指定clean目标,clean目标和cal目标是没有任何关系的
    附:直接执行make,是执行第一个目标;make [目标],是执行指定的目标。
    9. -命令 #加上-,表示如果命令有误,就忽略它继续执行下去,如果不加-,一旦命令有误就立刻终止执行了。
    举例说明:-rm /test 删除根目录下的test文件需要root权限,所以报错,但是加了-,会继续执行其他命令而不会终止。

    10. 单独编译当前目录下的每一个.c源文件

    src = $(wildcard *.c) //搜索当前目录的所有.c源文件,如test.c

    targets = $(patsubst %.c, %, $(src)) //去掉文件后缀,如test.c变为test

    CC = gcc

    CFLAGS = -Wall -g //添加调试选项,不需要调试可去掉

    all:$(targets) 

    $(targets):%:%.c //模式匹配%:%.c,直接写成%:%.c也可以

    $(CC) $< -o $@ $(CFLAGS)

    .PHONY:clean all //声明伪目标

    clean: -rm -rf $(targets) 

    11.更多参考GNU make手册 

  • 相关阅读:
    .NET 面试题汇总(带答案)
    C#声明一个100大小的数组 随机生成1-100之间不重复的数
    添加和读取Resources嵌入资源文件(例如.dll和.ssk文件)
    C#DataTable转List<T>互转
    “不允许使用邮箱名称。服务器响应为:”的错误解决办法
    微信多开防撤回(带提示)2.8.0.133补丁
    逆向某网站的登录接口生成元素加密
    C#中new的三种用法
    SQL Server查询第31到40条数据
    关于EF框架EntityState的几种状态
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/6785761.html
Copyright © 2011-2022 走看看