跟我一起写 Makefile (PDF 重制版)
什么是 makefile?或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的集成开 发环境(integrated development environment,IDE)都为你做了这个工作,但我觉得要作一个好的 和专业的程序员,makefile 还是要懂。这就好像现在有这么多的 HTML 编辑器,但如果你想成为一个专 业人士,你还是要了解 HTML 的标签的含义。特别在 Unix 下的软件编译,你就不能不自己写 makefile 了,会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile 关系到了整个工程的编译规则。一个工程中的源文件不计其数,并且按类型、功能、 模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需 要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚 本一样,其中也可以执行操作系统的命令。 makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全 自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile 中指令的命令 工具,一般来说,大多数的 IDE 都有这个命令,比如:Delphi 的 make,Visual C++ 的 nmake,Linux 下 GNU 的 make。可见,makefile 都成为了一种在工程方面的编译方法。 现在讲述如何写 makefile 的文章比较少,这是我想写这篇文章的原因。当然,不同产商的 make 各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对 GNU 的 make 进 行讲述,我的环境是 RedHat Linux 8.0,make 的版本是 3.80。毕竟,这个 make 是应用最为广泛的, 也是用得最多的。而且其还是最遵循于 IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档中,将以 C/C++ 的源码作为基础,所以必然涉及一些关于 C/C++ 的编译的知识。关于 这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是 UNIX 下的 GCC 和 CC。 ### makefile的概念与重要性 #### 一、makefile是什么? **makefile**是一种脚本文件,用于描述软件项目的编译构建过程。它定义了一系列规则,指明哪些文件需要先编译、哪些需要后编译以及哪些需要重新编译等。在Unix/Linux环境下尤其重要,因为它可以帮助开发者高效地管理和构建大型项目。 #### 二、为什么学习makefile很重要? 1. **提高编程专业水平**:对于Windows程序员来说,集成开发环境(IDE)通常会隐藏掉makefile的细节,但如果想成为一名专业程序员,理解makefile是非常必要的。 2. **掌握底层技术**:类似于HTML编辑器为用户提供方便的同时,了解HTML标签的含义对于成为一名专业Web开发者至关重要。同样地,在Unix环境下编写软件时,理解和编写makefile是必备技能之一。 3. **大型项目管理能力**:能够熟练编写makefile意味着具备处理大型工程项目的能力。makefile可以有效地组织和自动化复杂的构建流程,这对于大型项目尤为重要。 ### makefile的工作原理 #### 三、makefile的基本结构 - **规则**:定义了文件间的依赖关系和如何构建这些文件。 - **变量**:用于存储和传递值,简化makefile的编写。 - **函数**:提供一系列内置函数,可以用来处理字符串、文件名等。 - **条件语句**:允许根据条件执行不同的命令或规则。 #### 四、makefile的核心概念 1. **依赖关系**:makefile通过定义文件之间的依赖关系来确定哪些文件需要被重新编译。 2. **目标**:每个makefile至少包含一个目标,通常是最终希望构建的产品或可执行文件。 3. **命令**:为了构建某个目标,makefile可以包含一系列命令,这些命令会被make命令解释并执行。 4. **变量**:makefile支持变量,可以用来存储路径、文件列表等信息,从而简化makefile的编写。 #### 五、makefile示例分析 假设有一个简单的C/C++项目,包括以下几个文件: - `main.c`:主源代码文件。 - `utils.c`:辅助函数源代码文件。 - `main.o`:`main.c`编译后的对象文件。 - `utils.o`:`utils.c`编译后的对象文件。 - `app`:最终的可执行文件。 下面是一个基本的makefile示例: ```make CC = gcc CFLAGS = -Wall all: app app: main.o utils.o $(CC) $(CFLAGS) -o $@ $^ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f *.o app ``` 1. **目标**:“all”目标代表构建所有内容,实际上是构建名为“app”的可执行文件。 2. **规则**: - “app: main.o utils.o”表示只有当`main.o`和`utils.o`存在时才构建`app`。 - “%.o: %.c”是一个通用规则,表示任何`.c`文件都需要被编译成相应的`.o`文件。 3. **命令**:使用`gcc`命令进行编译。 4. **变量**:`CC`变量存储编译器名称,`CFLAGS`存储编译选项。 #### 六、makefile的高级特性 - **自动推导**:makefile可以根据文件扩展名自动推断构建规则。 - **多目标**:可以在一个规则中指定多个目标文件。 - **条件语句**:使用条件语句可以根据特定条件执行不同的规则或命令。 - **函数**:make提供了丰富的内置函数,如字符串处理函数、文件名操作函数等。 #### 七、makefile的实际应用场景 1. **跨平台编译**:makefile可以在不同的操作系统上使用,例如Windows下的nmake和Linux下的GNU make。 2. **持续集成**:在自动化构建过程中,makefile可以自动检测源代码更改并仅重新编译受影响的部分。 3. **大型项目管理**:对于包含大量源文件的项目,makefile可以帮助管理复杂的依赖关系,确保正确的编译顺序。 ### 总结 makefile是软件开发中不可或缺的一部分,尤其是在Unix/Linux环境中。通过学习和掌握makefile,不仅可以提升个人的技术水平,还能有效提高软件项目的构建效率和质量。无论是初学者还是资深开发者,都应该深入理解makefile的工作原理和最佳实践。
剩余79页未读,继续阅读
- 御风and逐梦2019-07-28不错不错。
- jason__ho2019-05-01重置版不错
- Nacidar2020-05-13是重置版,文件抬头都着写。清晰,非常好。
- eaglelau2019-05-28不错是 重置版
- cxbwater2019-07-13排版不错
- 粉丝: 201
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助