• Makefile相关知识


    1. Makefile的编写:
    1>. makefile的命名
    1. makefile
    2. Makefile
    2>. makefile中的规则
    三部分:
    目标(app):依赖(main.c a.c b.c)
    命令(gcc main.c a.c b.c -o app)
      gcc main.c a.c b.c -o app

    执行 make 命令, 就会按照makefile中编写的规则编译整个项目
    在makefile文件中可以有一个或多个规则

    第一版本:
       app:main.c sub.c mul.c add.c
       gcc main.c sub.c mul.c add.c -o app
    缺点: 修改一个程序, 重新make其他文件也会被重新编译

    改进:
    第二个版本:
    makefile工作时候的原理:
    1. 如果规则中的依赖不存在, 向下查找下边的规则, 使用找到的规则生成不存在的依赖.
    2. 通过时间判断是否更新:
    第一次: add.c -> add.o
    第二次: 修改add.c 如果目标的时间比依赖的时间早, 需要更新

    直接make生成的是一个条规则中的目标(终极目标)
    生成其他规则中的目标:
    make 其他规则中的目标的名字
    第二个版本程序:
       app:main.o sub.o mul.o add.o
       gcc main.o sub.o mul.o add.o -o app
       # 编写规则, 来生成依赖中不存在的文件
       main.o:main.c
       gcc -c main.c
       sub.o:sub.c
       gcc -c sub.c
       mul.o:mul.c
       gcc -c mul.c
       add.o:add.c
       gcc -c add.c
     
       hello:
       echo "hello makefile"
    缺点: 代码冗余

    第三版本:
    变量: 自动变量: 自定变量只能在规则的命令中使用
    $<: 依赖中的第一个
    $^: 所有的依赖
    $@: 规则中的目标
    %.o:%.c
    main.o:main.c
    gcc -c main.c
    gcc -c main.c -o main.o
    大写: makefile中自带的变量:
    CC == cc == gcc
    CPPFLAGS = -I./

    代码:
       # 自定义变量
       obj = main.o sub.o mul.o add.o
       app:$(obj)
       gcc $(obj) -o app
       # 编写规则, 来生成依赖中不存在的文件
       # 模式规则
       %.o:%.c
       gcc -c $< -o $@
    缺点: .o还是需要手动指定, 适应能力不行

    版本4:
    使用函数: -- 在makefile里边, 所有的函数都是有返回值的
    1. wildcard -- 搜索指定目录下,指定类型的文件
    2. patsubst -- 匹配替换函数
    代码:
      # 使用makefile中的函数
      src = $(wildcard ./*.c)
      obj = $(patsubst %.c, %.o, $(src))
      app:$(obj)
        gcc $(obj) -o app
      # 编写规则, 来生成依赖中不存在的文件
      # 模式规则
      %.o:%.c
        gcc -c $< -o $@
    缺点: 没有清除项目的功能

    版本5:
    声明伪目标: 不对文件做是否更新的判断
    .PHONY:目标名

      # 使用makefile中的函数 

      target = app
      src = $(wildcard ./*.c)
      obj = $(patsubst %.c, %.o, $(src))
      app:$(obj)
        gcc $(obj) -o app
      # 编写规则, 来生成依赖中不存在的文件
      # 模式规则
      %.o:%.c
        gcc -c $< -o $@

      #伪目标

      .PHONY:clean

      clean:

        -rm -f $(obj) $(target)

    (20170110)改进版:

    target = $(patsubst %.c,%.out,$(src)) //多个源文件生成多个可执行文件
    src = $(wildcard ./*.c)
    obj = $(patsubst %.c,%.o,$(src))
    app:$(obj)
      gcc $(obj) -o $(target)
    %.o:%.c
      gcc -c $< -o $@
    .PHONY:clean
    clean:
      -rm -f $(obj) $(target)

      

    技术是一张窗户纸,一捅就破,come!
  • 相关阅读:
    Log4J输出日志到WEB工程目录的实现方法
    MyEclipse 10 中增加svn插件
    Web 项目添加log4j
    ruby on rails 之旅 第一章 ubuntu11.10安装
    ruby on rails 之旅 第一章 ubuntu12.04安装
    centos 6.3 server 安装mysql5
    技术实践第四期|解读移动开发者日常性能监控平台应用
    电脑一族预防颈椎劳损八法
    方便的使用单击和双击更新DataGrid中的数据的例子(转载)
    不重复随机数列生成算法
  • 原文地址:https://www.cnblogs.com/adeng-x/p/6248124.html
Copyright © 2020-2023  润新知