文章目录

  • 1 make与Makefile的关系
  • 2 Makefile里面放的是依赖关系和依赖方法
  • 3 原理

一个工程中的源文件有很多,按照它们的模块,功能和类型,分别放在不同的目录中,Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。Makefile带来的好处就是自动化编译,一旦写好只需要一个make命令,就可以完成整个工程的自动编译。

1 make与Makefile的关系

make是一条命令工具,一个解释Makefile中指令的命令工具,Makefile是一个文件,两个搭配使用完成项目的自动化构建。

2 Makefile里面放的是依赖关系和依赖方法

提前创建一个hello.c文件
再创建Makefile文件

打开Makefile文件


hello: hello.o gcc test.o -o test 应该改为: hello: hello.o gcc hello.o -o hello
依赖关系:
以上图为例
生成hello文件依赖hello.o
生成hello.o文件依赖hello.s
生成hello.s文件依赖hello.i
生成hello.i文件依赖hello.c

冒号左侧叫做目标文件
冒号右侧叫做依赖文件列表(有多个依赖文件时,用空格分开)

依赖方法:
gcc hello.* -option hello.*

这里解释一下上图几条依赖方法的意思

预处理(进行宏替换):gcc -E hello.c -o hello.i
选项·-E:让gcc在预处理结束后停止编译过程
选项-o是指目标文件,i文件为已经预处理过的C原始程序

编译(生成汇编):gcc -S hello.i -o hello.s
选项-S查看代码是否规范无误

汇编(生成机器可识别的代码):gcc -c hello.s -o hello.o
汇编阶段将编译阶段生成的.s文件转换成目标文件
选项-c可以看到汇编代码已经转换成.o的二进制目标代码

连接(生成可执行文件或库文件):gcc hello.o -o hello
成功编译后,进入了链接阶段

3 原理

当我们输入make命令之后:

make会在当前目录下查找名叫Makefil或者makefile的文件
如果找到,它会在找到文件中的第一个目标文件,比如在上面的例子中它会找到hello这个文件,并把这个文件作为最终目标文件。
如果hello不存在,或者hello所依赖的后面的hello.o文件的文件修改时间比hello这个文件新,那么它就会执行后面定义的命令来生成这个文件。
如果hello所依赖的文件hello.o不存在,那么make会在当前文件中找目标文件为hello.o文件的依赖性,如果找到再根据那一个规则生成hello.o文件。
这里C文件和H文件都存在,于是make会生成hello.o文件,然后再用hello.o文件声明make的终极目标,即执行hello文件。
(这就是整个make的依赖性,make会一层一层的去找文件的依赖关系,直到最后编译出第一个目标文件,在找寻过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会推出,并报错。对于定义的命令错误,或者比阿尼不成功,make是不管的。make就只管文件的依赖性,即如果找在找了依赖关系之后,冒号后面的文件还是不在,那么make就不工作了。)

【Linux入门到精通系列讲解】工具——make/Makefile相关推荐

  1. 【Linux入门到精通系列讲解】VFS分区动态绑定和CentOS7分区类型

    文章目录 1 VFS分区动态绑定 2 CentOS7分区类型 1 VFS分区动态绑定 VFS和ext2文件系统都使用超级块和索引节点来描述和管理系统中的文件,每个安装的文件系统都有一个VFS超级块. ...

  2. 【Linux入门到精通系列讲解】一些基础问题

    文章目录 1 简述 Linux 的四个主要的应用方面(要求有详细说明) 2 简述 Linux 系统中普通用户执行 root 用户权限命令的方式,并分别给出需满足的条件和操作实例. 3 简述 Linux ...

  3. 【Linux入门到精通系列讲解】.bashrc 文件作用

    Linux 系统中很多 shell,包括bash,sh,zsh,dash 和 korn 等,不管哪种 shell 都会有一个 .bashrc 的隐藏文件,它就相当于 shell 的配置文件. 一般会有 ...

  4. 【Linux入门到精通系列讲解】Centos 7软件安装的三种方式

    centos 软件安装的三种方式 Linux下面安装软件的常见方法: 一.yum 替你下载软件 替你安装 替你解决依赖关系 点外卖 缺少的东西 外卖解决 1.方便 简单 2.没有办法深入修改 yum ...

  5. 【Linux入门到精通系列讲解】Linux如何创建和删除swap分区

    Linux中的swap分区类似Windows的虚拟内存,在硬盘空间不足的情况下,可通过创建swap分区来解决,下面小编就给大家介绍下Linux如何创建和删除swap分区. 文章目录 1 swap概述 ...

  6. 【Linux入门到精通系列讲解】Ubuntu下使用gcc编译并运行C程序

    文章目录 1 hello 2 命令 3 linux下gcc编译多个源文件 1 hello 2 命令 在终端输入 Ubuntu命令 $ gcc hello.c -o hello $ ./hello == ...

  7. 【Linux入门到精通系列讲解】shell中的eval命令

    eval命令用法: 当我们在命令行前加上eval时,shell就会在执行命令之前扫描它两次.eval命令将首先会先扫描命令行进行所有的置换,然后再执行该命令.该命令适用于那些一次扫描无法实现其功能的变 ...

  8. 【Linux入门到精通系列讲解】系统调用和库函数路径

    cpp -v查看

  9. 【Linux入门到精通系列讲解】内存管理malloc和free函数

    函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). 关于分配失败的原 ...

最新文章

  1. 最长公共子序列问题 (LCS)
  2. HTML5主要新增标签
  3. 前端开发注意事项(HTML与CSS进阶)
  4. 黔东南天气预报软件测试,黔东南天气预报15天
  5. openstack havana vlan安装成功
  6. 第十一节课 课堂总结
  7. Android性能优化——界面流畅度优化
  8. Bytom国密网说明和指南
  9. BZOJ 1211: [HNOI2004]树的计数 purfer序列
  10. [JavaScript]Call和Apply方法
  11. Apache SeaTunnel(Incubating) 2.2.0-beta 版本发布!API 重构,连接器与引擎解偶
  12. CORS请求的简单请求和非简单请求
  13. DVD管理系统修改版
  14. iOS 通过github自动打包ipa
  15. wpsppt插入html,WPS的做好的一个PPT 怎么插入到另一个PPT?
  16. 数据结构:静动图结合,活灵活现 讲解—— 堆排序, 直接选择排序
  17. 对脏写、脏读、不可重复度、幻读的理解笔记
  18. 大学物理第一章笔记——高等农林院校基础课程教程系列
  19. c语言贪心算法零钱问题,贪心算法(2)——找零钱问题
  20. ActiveSync 3.7

热门文章

  1. 人脸识别数据集bin解压
  2. python 跳出多重循环
  3. 相邻帧差法和三帧差法
  4. canvas 轮播图片
  5. Python3 调用ffmpeg
  6. Focal Loss 的Pytorch
  7. flask管理不同的路由
  8. 商汤科技开源DAVIS2017视频目标分割冠军代码
  9. python 调用c++回调char*
  10. ping 不通容器 宿主_Docker容器间通信