跟我一起写 Makefile


-
跟我一起写 Makefile PDF中文清晰版
第一章概述 什么是 或许很多 的程序员都不知道这个东西,因为那些 的都为你做了这个工作,但我觉得要作一个好的和 的程序员, 还是要懂。这就好像现在有这么多的的编辑器,但如果你想成为一个专业 人上,你还是要了解 的标识的含义。特别在 下的软件编译,你就不能不自凵写 了,会不会写 ,从一个侧面说明了一个人是否具备完成人型工程的能 力 因为 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、 功能、模块分别放在若干个日录中 定义了一系列的规则来指定,哪些文件需要 先编译,哪些文件需要后编译,哪塏文件需要重新编译,甚至于进行更复杂的功能操作,因 为 就像 脚本一样,其中也可以执行操作系统的命令。 带来的好处就是——“自动化编译”,旦写好,只需要个命令,整个⊥ 程完仝自动编译,极大的提高了软件开发的效率。 是一个命令工具,是一个解释 中指令的命令工具,一般来说,大多数的都有这个命令,比如: 的 的 的 可见 都成为了一种 在工程方面的编译方法。 现在讲述如何写 的文章比较少,这是我想与这篇文章的原因。当然,不同产商的 各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅 对的进行讲述,我的坯境是 的版木是 。必竟, 这个 是应用最为广泛的,也是用得最多的。而且其还是最遵循于 标准的 在这篇文档中,将以 的源码作为我们基础,所以必然涉及一些关于 的编译的 知识,相关于这方面的内容,迩请各位査看相关的编译器的文档。这里所默认的编译器是 下的和 第二章关于程序的编译和链接 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是 、还是 首先要把源文件编译成中间代码文件,在 下也就是 文件 下是文 件,即 ,这个动作叫做编译( )。然后再把大量的 合成执行文件,这个动作叫做链接()。 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对」后者,通常是你需要 告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在 文件中 只要所有的语法止确,编译器就可以编译出中间目标文件。般来说,每个源文件都应该对 应于一个中间目标文件(文件或是文件) 链接时,主要是链接函数和全局变量,所以,我们可以使用这些中问目标文件(文件或是 文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标 文件( ),在大多数时候,由于源文件太多,编译生成的中间目标文件太多 而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目 标文件打个包,在 下这种包叫“库文件”( ,也就是 文件, 在 卜,是 也就是文件。 总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时, 编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编详器会给出一个 警告,但可以生成 而在链接程序时,链接器会在所有的 中 找寻函数的实现,如果找不到,那到就会报链接错误码 ),在下,这种 错误一般是 错误,意思说是说,链接器未能找到函数的实现。你需要指定函 数的 好,言归正传,的有许多的内容,闲言少叙,还是让我们开始吧 第三章 介绍 命令执行时,需要一个 文件,以告诉命令需要怎么样的去编译和链 接程序。 首先,我们用一个示例来说明 的书写规则。以便给人家一个感兴认识。这个示例 来源于的使用手册,在这个示例中,我们的工程有个文件,和个头文件, 我们要写一个 来告诉命令如何编译和链接这几个文件。我们的规则是: )如果这个工程没有编译过,那么我们的所有文件都要编译)被链接。 )如果这个工程的杲几个文件被修改,那么我们只编译被修改的文件,并链接目 标程序。 )如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的文件, 并链接目标程序。 只要我们的 写得够好,所有的这切,我们只用个命令就可以完成, 命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所 需要的文件和链接目标程序。 的规则 在讲述这个 之前,还是让我们先来粗略地看一看 的规则。 也就是一个目标文件,可以是 也可以是执行文件。还可以是 个标签( ),对」标签这种特性,在后续的“伪目标”章节中会有叙述 就是,要生成那个 所需要的文件或是目标 也就是需要执行的命令。(任意的 命令) 这是一个文件的依赖关系,也就是说 这一个或多个的日标文件依赖于 中的文件,其生成规则定义在 中。说白一点就是说, 中如果有一个以上的文件比 文件要新的话 所定义的 命令就会被执行。这就是 的规则。也就是 中最核心的内容 说到底, 的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然, 这是 的主线和核心,但要写好一个 还不够,我会以后面一点一点地 结合我的工作经验给你慢慢到来。内容还多着呢。) 一个示例 正如前面所说的,如果·个上程有个头文件,和个文件,我们为了完成前面所述的那 三个规则,我们的 应该是下面的这个样子的 反斜杠()是换行符的意思。这样比较便于 的易读。我们可以把这个内容保存 在文件为“ 或 的文件中,然后在该目录下直接输入命令“ 就可以生成执行文件。如果要删除执行文件和所有的中间目标文件,那么,只要筍单 地执行一下“ ”就可以了。 在这个 中,日标文件( )包含:执行文件和中间日标文件(), 依赖文件 )就是冒号后面的那些文件和文件。每一个文件 都有一组依赖文件,前这些文件又是执行文件 的依赖文件。依赖关系的实质上 就是说明了目标文件是山哪些文件牛成的,换言之,目标文件是哪些文件更新的。 在定义好依赖关系后,后续的那一行定义了如何生成日标文件的操作系统命令,一定要以 键作为开头。记住,并不管命令是怎么工作的,他只管执行所定义的命令。 会比较 文件和 文件的修改口期,如果 文件的 日期要比 文件的日期要新,或者 不存在的话,那么,就会执行后续 定义的命令。 这里要说明一点的是, 不是一个文件,它只不过是一个动作名字,有点像语言中的 样,其冒号后什么也没有,那么, 就不会自动去找文件的依赖性,也就不会 臼动执行其后所定义的命令。要执行其后的命令,就要在命令后明显得指出这个 的名字。这样的方法非常有用,我们可以在一个 中定义不用的编译或是和编译无 关的命令,比如程序的打包,程序的备份,等等。 是如何工作的 在默认的方式下,也就是我们只输入命令。那么, 会在当前日录下找名字叫“ 或 的文件。 如果找到,它会找文件中的第一个目标文件( ),在上面的例子中,他会找 到“”这个文件,并把这个文件作为最终的目标文件 、如果文件不存在,或是所依赖的后面的文件的文什修改时间要比 这个文件新,那么,他就会执行后面所定义的命令来生成这个文件 如果所依赖的文件也存在,那么会在当前文件中找目标为文件的 依赖性,如果找到则再根据那一个规则生成文件。(这有点像一个堆栈的过程) 、当然,你的文件和文件是存在的啦,于是会生成文件,然后再用 文件住命 的终极仟务,也就是执行文件 这就是整个 的依赖性, 会一层又一层地去找文件的依赖关系,直到最终编译出 第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 就会直接退出,并报错,前对于所定义的命令的错误,或是编译不成功, 根木不理 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那 么对不起,我就不工作啦 通过上述分析,我们知道,像 这种,没有被第一个目标文件直接或间接关联,那么 它后面所定义的命令将不会被自动执行,不过,我们可以显示要 执行。即命令 ,以此来淸除所有的目标文件,以便重编译。 于是在我们编程中,如果这个工程凵被编译过了,当我们修改了其中一个源文件,比如 那么根据我们的依赖性,我们的目标 会被重编译(也就是在这个依性关 系后面所定义的命令),于是 的文件也是最新的啦,于是 的文件修改时间 要比要新,所以也会被重新链接了(详见日标文件后定义的命令) 而如果我们改变了“ ”,那么, 和 都会被重编译, 并且, 会被重链接。 四 中使用变量 在上面的例子中,先让我们看看 的规则 我们可以看到文件的宇符串被重复了两次,如果我们的工程需要加入一个新的文 件,那么我们需要在两个地方加(应该是三个地方,还有一个地方在 中)。当然,我 们的 并不复,所以在两个地方加也不累,但如果 变得复杂,那么 我们就有可能会忘掉一个需要加入的地方,而导致编详失败。所以,为了 的易维 护,在 中我们可以使用变量。 的变量也就是一个字符串,理解成 语言中的宏可能会更好 比如,我们声明个变量, 或是 反 正不管什么啦,只要能够表小文件就行了。我们在 开始就这样定义 于是,我们就可以很方便地在我们的 中以“ ”的方式来使用这个变 量了,于是我们的改良版 就变成下面这个样子 于是如果有新的文件加入,我们只需简单地修改 变量就可以了 关于变量更多的话题,我会在后续给你一一道来。 五、让 自动推导 的很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必 要去在每一个文件后都写上类似的命令,因为,我们的会自动识别,并自凵推导 命令。 只要 看到一个文件,它就会自动的把文件加在依赖关系中,如果 找 到一个 那么 就会是 的依赖文件。并且 也会被推导出来,」是,我们的 再也不用写得这么复杂。我们的 是新的 又出炉了。 这种方法,也就是的“隐悔规则”。上面文件内容中,“ ”表示, 是个 伪日标文件。 关于更为详细的“隐晦规则”和“伪目标文件”,我会在后续给你一一道来 六、另类风格的 即然我们的 可以自动推导命令,那么我看到那堆和的依赖就有点不爽,那 么多的重复的 能不能把其收拢起来,好吧,没有问题,这个对于来说很容易, 谁叫它提供了自动推导命令和文件的功能呢?来看看最新风格的 这种风格,让我们的 变得很简单,但我们的文件依赖关系就显得有点凌乱了。鱼 和熊掌不可兼得。还看你的喜好了。我是不喜欢这种风格的,是文件的依赖关系看不清楚, 二是如果文件一多,要加入几个新的文件,那就理不清楚了。 七、清空目标文件的规则 每个 中都应该写一个清空目标文件(和执行文件)的规则,这不仅便于重编 译,也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《缤程修养》吗)。 般的风格都是 更为稳健的做法是

477KB
跟我一起写Makefile (PDF重制版)
2017-01-24跟我一起写Makefile Makefile学习
806KB
跟我一起写 Makefile修正版
2019-06-09跟我一起写 Makefile修正版 修复部分错误,和书签错误的版本。
442KB
跟我一起写 Makefile.pdf
2018-05-15跟我一起写 Makefile.pdf
417KB
《跟我一起写Makefile 陈皓著》高清带书签版
2019-03-09什么是makefile?或许很多Windows的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要
585KB
跟我一起写Makefile.pdf 修订版
2017-07-08在原版基础上,做了如下修订: - 更正了有关make返回值的两处描述,分别位于P54和P59。 - 更正了目录层次。
1.1MB
跟我一起写Makefile.pdf
2013-10-22跟我一起写Makefile,makefile的作用毋庸置疑,Linux下的编译链接全靠它了 值得拥有,值得拥有,值得拥有
398KB
跟我一起写makefile
2017-05-26学makefile的入门好资源
632KB
跟我一起写 Makefile (PDF 重制版)
2018-10-28什么是 makefile?或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的集成开 发环境(integrated development environment,IDE)
543KB
跟我一起写Makefile书签版PDF清晰版
2013-09-06跟我一起写Makefile书签版PDF清晰版:有书签的 ,网上其他版本都没有书签,不方便阅读及查阅。
1.4MB
《跟我一起写makefile》带目录可编辑版
2018-11-04《跟我一起写makefile》带目录可编辑版,讲解通俗易懂,能够帮助你系统性学习Makefile,看完基本可以搞定普通的大工程
548KB
跟我一起写Makefile.pdf(中文经典教程)陈皓大神力作
2019-04-10跟我一起写Makefile.pdf(中文经典教程)陈皓大神力作,思路清晰,讲解透彻
381KB
跟我一起写Makefile
2018-12-14跟我一起写Makefile,适合初学者刚接触Makefile。 跟我一起写Makefile,适合初学者刚接触Makefile。
988KB
跟我一起写Makefile(可以注释版).pdf
2020-06-22跟一起写makefile系列文章的总结版本,合在一起可以更加方便的阅读,不是纯图片格式,文字可以自己添加笔记
91KB
跟我一起写makefile(epub版)
2016-01-29可以在多看pad或者手机上看,非常方便。
580KB
跟我一起写Makefile陈皓.pdf
2020-03-13makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译, 极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile 中
417KB
跟我一起写makefile.pdf
2021-01-10跟我一起写makefile.pdf
619KB
跟我一起写Makefile_陈皓_2020.pdf
2020-09-10大佬写的关于如何写Makefile的一个指南。 不看PDF版本的可以自行去大佬CSDN链接查看:https://blog.csdn.net/haoel 资源来自于网络,看到这个版本觉得制作很精良,就分
913KB
跟我一起写 Makefile.zip
2020-07-12跟我一起写 Makefile.zip
415KB
跟我一起写 Makefile.7z
2020-08-18《跟我一起写Makefile》小白的Makefile编写从入门到入坑,该课本算是小白入门的必备助力。
1.2MB
cmake教程,cmake实践,跟我一起写Makefile,三本合一带书签
2020-09-10cmake教程,cmake实践,跟我一起写Makefile三本合一,带书签。 学习cmake很好的教材
630KB
跟我一起写 Makefile_(PDF 重制版).rar
2020-07-27什么是 makefile?或许很多 Windows 的程序员都不知道这个东西,因为那些 Windows 的集成开发 环境(integrated development environment,IDE)
Mysql数据库基础入门视频教程
2018-10-24Mysql数据库基础入门视频课程:属于零基础Mysql数据库教程,从数据库的基本专业术语介绍到数据库软件的下载使用 一步一步带你安装MySql。SQL阶段你将学会如果使用数据定义语言DDL,数据操作语言DML,数据查询语言DQL 在学会各中查询语句之后,会带你学习数据的完整性, 掌握如果正确的向数据库中添加数据 以上掌握技能之后,将会带你学习如何进行多表操作,关系的建立,各种连接查询等. 常用函数,事务的学习,您将学到什么是事务的提交,回滚,并发操作及脏读,幻读. 最后视图,存储过程,索引的学习,将会带你掌握更高级的数据库技术.
7.25MB
四史答题软件安装包exe
2021-02-28四史答题软件安装包exe
309KB
obs-multi-rtmp_Windows_0.2.4.zip
2020-07-10OBS多路推流插件obs-multi-rtmp
程序员的数学:微积分
2019-09-28本课程介绍程序员必备的数学基础内容,在取材上侧重人工智能、数据分析等热门领域
Java系列技术之JavaWeb入门
2018-09-18JavaWeb里的基础核心技术
JAVA入门精品课程
2018-12-20课程目标: 1、让初学者从小白开始,善于运用知识点,解脱学习的苦恼 2、能够学习更多的工作中使用技巧,成为编程高手
-
学院
MySQL 视图
MySQL 视图
-
下载
鲲鹏pc测试工具.zip
鲲鹏pc测试工具.zip
-
学院
MySQL 触发器
MySQL 触发器
-
学院
C#Winform桌面开发编程上位机基础入门
C#Winform桌面开发编程上位机基础入门
-
学院
基于SSM实现的房屋租赁系统【附源码】(毕设)
基于SSM实现的房屋租赁系统【附源码】(毕设)
-
博客
Canvas实战之时钟
Canvas实战之时钟
-
下载
中国计算机学会推荐国际学术会议和期刊目录.pdf
中国计算机学会推荐国际学术会议和期刊目录.pdf
-
学院
C# 高级网络编程及RRQMSocket框架详解
C# 高级网络编程及RRQMSocket框架详解
-
学院
MySQL 备份与恢复详解(高低版本 迁移;不同字符集 相互转换;表
MySQL 备份与恢复详解(高低版本 迁移;不同字符集 相互转换;表
-
博客
java中两行代码搞定根据路径截取文件名,适用于多系统,巴适!
java中两行代码搞定根据路径截取文件名,适用于多系统,巴适!
-
学院
CCNA_CCNP 思科网络认证 PAT NAT 端口或地址转换 与端
CCNA_CCNP 思科网络认证 PAT NAT 端口或地址转换 与端
-
学院
Docker核心技术进阶教程
Docker核心技术进阶教程
-
下载
springboo整合redis实例
springboo整合redis实例
-
博客
MyBatis核心配置
MyBatis核心配置
-
博客
Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案
Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案
-
博客
字节,腾讯,百度,阿里,美团500多道算法面试题
字节,腾讯,百度,阿里,美团500多道算法面试题
-
博客
mysqldump中断的常见错误和解决措施【转载】
mysqldump中断的常见错误和解决措施【转载】
-
博客
一图看尽 Go 1.16 变更
一图看尽 Go 1.16 变更
-
学院
2021年 系统架构设计师 系列课
2021年 系统架构设计师 系列课
-
博客
2021年建筑电工(建筑特殊工种)考试总结及建筑电工(建筑特殊工种)模拟试题
2021年建筑电工(建筑特殊工种)考试总结及建筑电工(建筑特殊工种)模拟试题
-
下载
Mercury.LoadRunner.8.1.英文版.(Win32.云端版)
Mercury.LoadRunner.8.1.英文版.(Win32.云端版)
-
博客
jmeter运行报错
jmeter运行报错
-
学院
【爱码农】C#制作MDI文本编辑器
【爱码农】C#制作MDI文本编辑器
-
下载
适配文档-登陆端口都在这里面.docx
适配文档-登陆端口都在这里面.docx
-
学院
转行做IT-第15章 Collection、泛型、Iterator
转行做IT-第15章 Collection、泛型、Iterator
-
下载
JavaEE在线学习系统.zip
JavaEE在线学习系统.zip
-
学院
CCNA_CCNP 思科网络认证 动态路由 EIGRP 和 OSPF
CCNA_CCNP 思科网络认证 动态路由 EIGRP 和 OSPF
-
博客
人类行为识别以及Pytorch实现
人类行为识别以及Pytorch实现
-
下载
building.obj
building.obj
-
博客
0基础学java得这样学,学习确实也得这样
0基础学java得这样学,学习确实也得这样