跟我一起写Makefile(PDF重制版)
《跟我一起写Makefile(PDF重制版)》是一份深入浅出的指南,由陈皓于2019年2月12日撰写,旨在帮助读者理解和掌握Makefile的编写技巧。Makefile是Unix/Linux系统中用于自动化构建、编译和链接程序的重要工具。下面我们将详细探讨Makefile的核心知识点。 1. **程序的编译和链接**:在软件开发过程中,源代码通常需要经过编译和链接两个步骤才能生成可执行文件。编译将源代码转化为目标文件,链接则将多个目标文件合并为单一的可执行文件。Makefile可以自动化这些过程,提高开发效率。 2. **Makefile的规则**:规则定义了目标文件与依赖文件之间的关系以及更新目标文件所需的命令。规则的基本格式为:`target : dependency... command...`,其中`target`是需要生成或更新的文件,`dependency`是目标文件依赖的文件,`command`是执行的命令。 3. **示例**:一个简单的Makefile可能包含一个规则,如`hello : hello.c`,表示`hello`这个可执行文件依赖于`hello.c`源文件。命令部分`gcc -o hello hello.c`告诉make如何生成`hello`。 4. **make的工作原理**:make会检查目标文件和依赖文件的时间戳,如果依赖文件比目标文件新或者目标文件不存在,就会执行相应的命令。 5. **Makefile中的变量**:变量可以用来存储重复使用的字符串,例如`CC=gcc`定义了编译器变量,`CFLAGS=-Wall`定义了编译选项。 6. **自动推导**:make可以自动推导某些类型的依赖关系,如C程序的`.c`文件到`.o`的目标文件。 7. **另类风格的Makefiles**:除了标准格式,还可以采用更简洁的GNUMakefile风格,比如使用隐含规则。 8. **清除目标文件的规则**:`clean`是一个常见的伪目标,用于清理生成的中间和目标文件,如`clean : ; rm -f *.o hello`。 9. **Makefile的内容**:通常包括规则、变量定义、函数调用等,用于指导make执行编译任务。 10. **Makefile的文件名**:默认情况下,make会查找名为`Makefile`或`makefile`的文件,但也可以指定其他名称。 11. **引用其他Makefile**:`include`指令可以引入其他Makefile,便于模块化管理。 12. **环境变量MAKEFILES**:该环境变量可以指定额外的Makefile路径,使make能读取更多的规则。 13. **书写规则**:规则定义了目标文件的生成逻辑,包括使用通配符处理多个文件、文件搜索路径、伪目标(如`clean`)以及多目标规则。 14. **命令书写**:命令可以被分隔符`|`分隔并行执行,也可以通过`@`符号控制是否显示命令本身。`$(shell command)`可以执行shell命令。 15. **命令执行**:make会以子shell的形式执行命令,错误检查可以通过`-`前缀忽略某些错误,`+`前缀确保即使有错误也会继续执行后续命令。 16. **定义命令包**:通过函数`define`和`endef`可以定义多行命令,提高可读性和复用性。 通过理解和掌握以上知识点,读者可以编写出高效的Makefile,实现项目的自动化构建,降低维护成本,提升开发效率。在实际应用中,还需要根据项目需求灵活运用这些概念,不断优化Makefile的设计。
剩余81页未读,继续阅读
- 粉丝: 16
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 本科毕设-基于51单片机的步进电机控制+源码+文档说明(高分作品)
- OpenFOAM 前向台阶超音速流动
- 基于Unity DOTS技术的Demo,演示RTS游戏框选功能的制作的思路(源码)
- 这个工具由两个脚本组成,分别用于生成和验证文件的 MD5 校验值,旨在确保文件在传输或存储过程中未被篡改或损坏
- C#ASP.NET小型服装店销售管理系统源码数据库 SQLITE源码类型 WinForm
- 一个爬取爱奇艺影视榜单的python程序(源码)
- 昱感微融合产品 YGW-L2 集成了激光雷达,可见光摄像头,红外摄像头,多传感器融合后生 成时空对齐的多维像素数据,通过 GMSL 接口发出 本品为客户提供更加直接、高效、和可 扩展的环境与事件感知能
- 1、判断是否回文正数 2、两个字符串相加 3、整理课上内容(HTML)
- 判断一个链表是否为回文链表,限制时间复杂度为O(n),空间复杂度为O(1) 如:1->2->2->1 1->2->3->2->1均为回文链表(C源码)
- c++课设,用c++的知识建立一个机房预约系统 分别有三种身份使用该程序,学生代表,教师,管理员
评论0