理解与编写Makefile:自动化编译的秘密

需积分: 10 5 下载量 191 浏览量 更新于2024-07-30 收藏 527KB PDF 举报
"跟我一起写 Makefile" Makefile 是一种在软件开发中用于自动化编译过程的文件,尤其在Unix/Linux环境下广泛使用。它定义了项目中不同文件之间的依赖关系以及编译、链接等规则。当项目源码发生变化时,通过运行 `make` 命令,Makefile 将根据这些规则自动决定哪些文件需要重新编译,从而提高开发效率。 在Windows环境下,IDE(集成开发环境)通常会自动处理这些编译任务,但在Unix-like系统中,手动编写Makefile是构建软件项目的重要环节。一个专业的程序员需要理解并掌握Makefile的编写,因为它不仅管理编译顺序,还能执行复杂的构建逻辑,甚至包括清理、测试等操作。 Makefile的基本结构由规则组成,每个规则包含目标(通常是编译后的目标文件或可执行文件)、依赖项(需要被编译或链接的源文件)以及命令(用于生成目标的命令)。例如: ```makefile target: dependency1 dependency2 command1 command2 ``` 在这个例子中,`target` 是要生成的目标,`dependency1` 和 `dependency2` 是它的依赖文件,`command1` 和 `command2` 是当依赖文件改变时执行的命令。`make` 会检查依赖文件的修改时间,如果比目标文件新,就会执行对应的命令。 Makefile中的变量和函数也提供了强大的灵活性,可以用来存储路径、编译选项等,简化Makefile的维护。例如: ```makefile CC = gcc CFLAGS = -Wall -g all: program program: main.o func.o $(CC) $(CFLAGS) -o $@ $^ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ ``` 这段Makefile中,`CC` 和 `CFLAGS` 分别定义了编译器和编译选项,`all` 是默认目标,`program` 目标依赖于 `main.o` 和 `func.o`,而 `.o` 文件的生成则依赖于相应的 `.c` 源文件。 在不同操作系统和开发环境中,`make` 工具可能有所差异,如Windows下的 `nmake` 或 Delphi 的 `make`,但它们的核心理念相似:管理和自动化文件依赖的构建过程。GNU Make是最广泛使用的实现,遵循IEEE标准,并且具有丰富的特性和功能。 写Makefile是一门技术,理解和掌握它对于提升软件开发的专业性和效率至关重要。本文将深入探讨如何编写有效的Makefile,特别是针对GNU Make的语法和技巧,帮助读者更好地应对大型项目的构建需求。
2018-08-07 上传
跟我一起写 Makefile 作者:陈皓 整理:祝冬华 来源网络,希望能与大家分享这份学习资料,资源分数也设置了最低值,如有侵权,请联系我删除文件。 第一部分、概述 (6) 第二部分、关于程序的编译和链接 (6) 第三部分、Makefile 介绍 (7) 一、Makefile的规则 (7) 二、一个示例 (8) 三、make是如何工作的 (9) 四、makefile中使用变量 (10) 五、让make自动推导 (11) 六、另类风格的makefile (12) 七、清空目标文件的规则 (13) 第四部分、Makefile 总述 (13) 一、Makefile里有什么? (13) 1、显式规则。 (14) 2、隐晦规则。 (14) 3、变量的定义。 (14) 4、文件指示。 (14) 5、注释。 (14) 二、Makefile的文件名 (15) 三、引用其它的Makefile (15) 四、环境变量 MAKEFILES (16) 五、make的工作方式 (16) 第五部分、书写规则 (17) 一、规则举例 (17) 二、规则的语法 (17) 三、在规则中使用通配符 (18) 四、文件搜寻 (19) 五、伪目标 (20) 六、多目标 (22) 七、静态模式 (22) 八、自动生成依赖性 (24) 第六部分书写命令 (25) 一、显示命令 (26) 二、命令执行 (26) 三、命令出错 (27) 四、嵌套执行make (28) 五、定义命令包 (30) 第七部分使用变量 (30) 一、变量的基础 (31) 二、变量中的变量 (32) 三、变量高级用法 (34) 四、追加变量值 (37) 五、override 指示符 (37) 六、多行变量 (38) 八、目标变量 (39) 九、模式变量 (40) 第八部分使用条件判断 (40) 一、示例 (40) 二、语法 (42) 第九部分使用函数 (43) 一、函数的调用语法 (44) 二、字符串处理函数 (44) 1、subst (44) 2、patsubst (45) 3、strip (45) 4、findstring (46) 5、filter (46) 6、filter-out (46) 7、sort (47) 8、word (47) 9、wordlist (47) 10、words (47) 11、firstword (48) 12、字符串函数实例 (48) 三、文件名操作函数 (48) 1、dir (48) 2、notdir (48) 3、suffix (49) 4、basename (49) 5、addsuffix (49) 6、addprefix (49) 7、join (50) 四、foreach 函数 (50) 五、if 函数 (50) 六、call函数 (51) 七、origin函数 (51) “undefined” (52) “default” (52) “file” (52) “command line” (52) “override” (52) “automatic” (52) 八、shell函数 (53) 九、控制make的函数 (53) 1、error (53) 2、warning (54) 第十部分 make 的运行 (54) 二、指定Makefile (54) 三、指定目标 (55) “all” (56) “clean” (56) “install” (56) “print” (56) “tar” (56) “dist” (56) “TAGS” (56) “check”和“test” (56) 四、检查规则 (57) 五、make的参数 (57) 第十一部分隐含规则 (61) 一、使用隐含规则 (61) 二、隐含规则一览 (62) 1、编译C程序的隐含规则 (63) 2、编译C++程序的隐含规则 (63) 3、编译Pascal程序的隐含规则 (63) 4、编译Fortran/Ratfor程序的隐含规则 (63) 5、预处理Fortran/Ratfor程序的隐含规则 (63) 6、编译Modula-2程序的隐含规则 (63) 7、汇编和汇编预处理的隐含规则 (64) 8、链接Object文件的隐含规则 (64) 9、Yacc C程序时的隐含规则 (64) 10、Lex C程序时的隐含规则 (64) 11、Lex Ratfor程序时的隐含规则 (65) 12、从C程序、Yacc文件或Lex文件创建Lint库的隐含规则 (65) 三、隐含规则使用的变量 (65) 1、关于命令的变量。 (65) 2、关于命令参数的变量 (66) 四、隐含规则链 (67) 五、定义模式规则 (68) 1、模式规则介绍 (68) 2、模式