深入理解makefile规则与技巧

0 下载量 65 浏览量 更新于2024-09-02 收藏 52KB PDF 举报
"makefile学习总结" 在软件开发过程中,特别是在嵌入式系统领域,`Makefile`扮演着至关重要的角色。它是一个自动化构建工具,用于管理编译、链接和其他构建过程,使得开发者能够高效地管理和构建项目。本文将深入探讨`Makefile`的核心概念、规则以及一些常用技巧。 `Makefile`的规则由三部分组成:目标、依赖和命令。目标是你希望生成的文件,例如可执行程序或库文件。依赖是生成目标所需的文件,它们通常是最新的源代码文件或中间编译产物。命令则是在特定条件下执行的操作,用于将依赖转化为目标。 当`Makefile`运行时,它会检查目标和依赖的更新时间。如果目标比依赖旧或者目标不存在,`Makefile`就会执行相应的命令来更新目标。这是提高构建效率的关键,因为只有在必要的时候才会重新编译文件。 例如,下面的规则展示了如何编译和链接`hello`程序: ```make hello: hello.ca.c gcc -o hello hello.ca.c ``` 在这个例子中,`hello`是目标,`hello.ca.c`是依赖。如果`hello`不存在或者比`hello.ca.c`旧,`gcc`命令就会被执行,生成`hello`可执行文件。 更复杂的`Makefile`可能将编译和链接步骤分开,以便更精细地控制构建过程: ```make hello: hello.o a.o gcc -o hello hello.o a.o hello.o: hello.c gcc -c -o hello.o hello.c a.o: a.c gcc -c -o a.o a.c ``` 这种结构允许`Makefile`只编译那些源文件有改动的`.o`对象文件,然后再进行链接,节省了时间。 `Makefile`中还有一些特殊变量,可以简化规则的编写。例如: - `$@`代表当前目标。 - `$^`代表所有依赖项。 - `%.o`匹配所有`.o`文件。 - `%.c`匹配所有`.c`文件。 - `$<`代表目标后的第一个依赖。 通过这些变量,你可以写出更加简洁和通用的规则,如: ```make CC = gcc CFLAGS = -c %.o: %.c $(CC) $(CFLAGS) $< -o $@ ``` `Makefile`中的`clean`目标通常是一个虚拟目标,它没有实际的依赖,但是提供了一种方便的方式来清理生成的文件,例如: ```make clean: rm -f *.o hello ``` 通过执行`make clean`,你可以删除所有`.o`文件和最终的可执行文件`hello`,保持工作目录的整洁。 `Makefile`是软件开发流程中的一个强大工具,它帮助开发者自动化构建过程,提高效率。理解其规则、变量和技巧,对于任何嵌入式系统或软件开发项目都是至关重要的。通过熟练掌握`Makefile`,你可以在项目管理中节省大量时间和精力。
472 浏览量
makefile 实例分析 Makefile 语法分析 第一部分 VERSION = 2# 给变量VERSION赋值 PATCHLEVEL = 6# 给变量PATCHLEVEL赋值 SUBLEVEL = 22# 给变量SUBLEVEL赋值 EXTRAVERSION = .6# 给变量EXTRAVERSION赋值 NAME = Holy Dancing Manatees, Batman!# 给变量NAME赋值 # *DOCUMENTATION*# To see a list of typical targets execute "make help"# More info can be located in ./README# Comments in this file are targeted only to the developer, do not# expect to learn how to build the kernel reading this file. # Do not:# o use make's built-in rules and variables#    (this increases performance and avoid hard-to-debug behavour);# o print "Entering directory ...";MAKEFLAGS += -rR --no-print-directory# 操作符“+=”的作用是给变量(“+=”前面的MAKEFLAGS)追加值。# 如果变量(“+=”前面的MAKEFLAGS)之前没有定义过,那么,“+=”会自动变成“=”;# 如果前面有变量(“+=”前面的MAKEFLAGS)定义,那么“+=”会继承于前次操作的赋值符;# 如果前一次的是“:=”,那么“+=”会以“:=”作为其赋值符# 在执行make时的命令行选项参数被通过变量 “MAKEFLAGS”传递给子目录下的make程序。# 对于这个变量除非使用指示符“unexport”对它们进行声明,它们在整个make的执行过程中始终被自动的传递给所有的子make。# 还有个特殊变量SHELL与MAKEFLAGS一样,默认情况(没有用“unexport”声明)下在整个make的执行过程中被自动的传递给所有的子make。