技术交流QQ群:1027579432,欢迎你的加入!

1.make介绍

  • gcc:编译器(gcc根据菜谱进行编译)
  • make: linux自带的构建器(相当于一个菜谱)
    • 构建的规则(菜谱)在makefile中

2.makefile文件的命名

  • makefile
  • Makefile

3.makefile中的规则

  • gcc a.c b.c c.c -o app这种方法在文件很多情况下,利用gcc编译时会有很多参数,不利于整个项目的管理。因此,需要编写makefile文件,便于整个项目的编译。
  • makefile中的规则组成:目标,依赖,命令,具体格式如下:
    目标:依赖
    (tab缩进) 命令
    
  • 将gcc a.c b.c c.c -o app修改为make进行编译。于是,makefile中的规则如下所示:
    app:a.c b.c c.cgcc a.c b.c c.c -o app
    
  • makefile中由一条或多条规则组成

4.makefile的编写

  • 具体实例如下所示,第一个版本

    // gcc编译
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ls
    add.c  head.h  main.c  mul.c  sub.c
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ gcc add.c main.c sub.c -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app
    sum=36
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ rm app// make编译
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile
    app:add.c main.c sub.cgcc add.c main.c sub.c -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ls
    add.c  head.h  main.c  makefile  mul.c  sub.c
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    gcc add.c main.c sub.c -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app
    sum=36
    
  • 第一个版本的缺点:编译步骤花费时间很长,效率低,修改其中一个文件,所有文件会被重新编译
  • 具体实例如下所示,第二个版本
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile
    app:add.o main.o sub.ogcc add.o main.o sub.o -o appadd.o:add.cgcc add.c -cmain.o:main.cgcc main.c -csub.o:sub.cgcc sub.c -c
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ rm app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    gcc add.c -c
    gcc main.c -c
    gcc sub.c -c
    gcc add.o main.o sub.o -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app
    sum=36
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim add.c  # 仅对add.c文件增加一个空行!
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    gcc add.c -c
    gcc add.o main.o sub.o -o app
    
  • makefile工作原理:
    • 检测依赖(如第二个版本中的add.o main.o sub.o)是否存在:

      • 向下搜索下面的规则(如第二个版本中的add.o:add.c gcc add.c -c),如果有规则是用来生成查找的依赖(如第二个版本中的add.o main.o sub.o)的,执行规则中的命令;
    • 依赖存在,判断是否需要更新:
      • 原则:目标的时间 > 依赖的时间。反之,则更新。(如第二个版本中vim add.c,仅对add.c文件增加一个空行!make时只对add.c进行编译)
  • 第二个版本的缺点:makefile文件中有很多内容是冗余的
  • 具体实例如下所示,第三个版本
    • 自定义变量:obj=a.o b.o c.0

      • 变量的取值:aa=$(obj)
    • makefile自带的变量:大写
      • CPPFLAGS
      • CC
    • 自动变量:自动变量只能在规则的命令中使用!
      • $@:规则中的目标
      • $<:规则中的第一个依赖
      • $^:规则中所有的依赖
    dl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile
    obj = add.o main.o sub.o
    target = app
    $(target):$(obj)gcc $(obj) -o $(target)
    # 也可以使用自动变量gcc $^ -o $@%.o:%.cgcc -c $< -o $@
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ rm *.o
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    cc    -c -o add.o add.c
    cc    -c -o main.o main.c
    cc    -c -o sub.o sub.c
    gcc add.o main.o sub.o -o app
    
  • 模式匹配:%.o:%.c
    • 第一次:add.o没有
    add.o:add.cgcc -c add.c -o add.o
    
    • 第二次:main.o没有
    main.o:main.cgcc -c main.c -o main.o
    

5.makefile中的函数

  • 第三个版本的缺点:可移植性比较差
  • 具体实例如下所示,第四个版本
    • makefile中的所有函数都是有返回值
    • wildcard查找指定目录下的指定类型的文件(如 ./.c):src = $(wildcard ./.c)
    • 匹配替换:obj = $(patsubst %.c, %.o, $(src))
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile
    src = $(wildcard ./*.c)
    obj = $(patsubst %..c, %..o, $(src))
    target = app
    $(target):$(obj)gcc $^ -o $@%..o:%..cgcc -c $< -o $@
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    gcc mul.c main.c add.c sub.c -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app
    sum=36
    

6.makefile中添加项目清理功能

  • 第四个版本的缺点:不能清理项目
  • 具体实例如下所示,第五个版本
    • 让make生成不是终极目标的目标:make 目标名
    • 编写一个清理项目的规则:
    clean:rm *.o app
    
    • 声明伪目标:
    .PHONY:clean
    
    • -f:强制执行
    • 命令前加-:忽略执行失败的命令,继续向下执行其余的命令;
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile
    src = $(wildcard ./*.c)
    obj = $(patsubst %..c, %..o, $(src))
    target = app
    $(target):$(obj)gcc $^ -o $@%..o:%..cgcc -c $< -o $@
    .PHONY:clean
    clean:-mkdir /abc -rm  $(obj) $(target) -f
    

makefile文件编写教程相关推荐

  1. 基础知识(三)makefile文件编写初级篇

    linux下进行c++开发,需要熟悉相关编译器的编译.链接命令.这边主要以实例讲解,如何在linux中,进行c++程序简单的编译链接运行. 一.单文件编译链接 这里先从最简单的单个文件编译链接为例.在 ...

  2. SYNOPSYS VCS Makefile文件编写与研究

    SYNOPSYS VCS Makefile文件编写与研究 这个Makefile是synopsys提供的模板,看上去非常好用,你只要按部就班提供实际项目的参数就可以了.我们来看这个文件的头部说明: ma ...

  3. Linux编程——入门级Makefile文件编写

    前言 1.在Linux开发环境中,编写Makefile文件是一个必须的技能,虽然现在有好多IDE可以自动生成所需要的Makefile文件,但有时能看懂Makefile文件也是更好的了解项目的编译过程. ...

  4. 从简入难makefile文件编写,Linux C++编程,简单vi命令

     1.一个最基本的C++程序 2.第二个c++程序 3.第一个入门级别的简单的makefile 4.在makefile中定义变量. 5.编写makefile的依赖 如果start:标识后面的某个. ...

  5. makefile文件编写_九图记住Makefile

    本文首次编辑时间2020.07.20 最后编辑时间2020.08.03 欢迎转载,转载请附上原文链接 参考: GNU make说明文档:https://www.gnu.org/software/mak ...

  6. makefile文件编写

    makefile文件用于管理和组织代码工程的编译和链接,其不是可执行文件,其被make工具解析并完成相关动作,下面笔者将介绍makefile中常用的一些语法说明: 1.文件包含: 语法:include ...

  7. 简单的makefile文件编写

    习惯了windows下ide创建工程已经代码的编写,然后一键运行,很简单,因为很多事ide都帮我们做了,但是linux下不一样,需要手动编译,执行一条条的命令,一般工程都是由于很多文件组成的,比如c+ ...

  8. Makefile文件编写规则

    From: http://aviva.iteye.com/blog/807494 Makefile中包含五种内容:显式规则,隐式规则,变量定义,指令(directive)和注释. 1.显式规则――描述 ...

  9. C++库文件和头文件编写教程

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 「本文介绍了在Linux系统下生成库文件,以及编写头文件来使用该库 ...

最新文章

  1. [EnterpriseServices]利用assembly定义我们的组件在COM+中的注册方式
  2. Ngrok: 使用 Ngrok 实现内网穿透
  3. 笔记-信息系统开发基础-uml-uml类图关系
  4. mysql如何获取当前时间
  5. 微信小程序 设置背景占满整个页面
  6. 太阳能板清洗机器人科沃斯_太阳能电池板清洁机器人
  7. linux挂载iso镜像进系统,linux可以加载iso镜像文件到启动项吗
  8. ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序
  9. SAP License:SAP Solution Manager中的常用命令
  10. 词汇表生成(C语言)
  11. 水晶报表基础入门——4.水晶报表排序、分组技术
  12. lasted是什么意思_lasted是什么意思_lasted怎么读_lasted翻译_用法_发音_词组_同反义词_继续存在( last的过去式和过去分词 )-新东方在线英语词典...
  13. 解决:另一个 SqlParameterCollection 中已包含 SqlParameter。
  14. 服务器恶意发包行为排查
  15. Twaver-HTML5基础学习(12)连线(Link)
  16. UDE2021开展首日回顾,“黑科技”含量超标了!
  17. Mac和Windows系统中ssh密钥的生成和共享
  18. sci四区大水刊 计算机,sci四区大水刊_sci四区免费大水刊_sci四区什么水平
  19. 使用猿如意体验【ChatGPT】
  20. RISC-V 指令架构 -- 模式切换

热门文章

  1. ZOJ-1654 Place the Robots---二分图最小点覆盖+构图
  2. LINUX应用与发展简介
  3. ADO.NET 常用对象(18)
  4. JavaScript Array 对象方法
  5. 控制C++的内存分配
  6. 网易2017校招编程:计算糖果
  7. Beyond MySQL --Branching the popular database--转载
  8. rsyslog概要以及源码安装mysql,rsyslog输出到Mysql基于loganalyzer查看分析
  9. android TranslateAnimation动画执行时的坐标获取。
  10. 主题:windows 如何查看端口占用情况?