[摘至嵌入式linux应用程序开发详解]
Make工程管理器就是个自动编译管理器,它通过读取Makefile文件的内容来执行大量的编译工作。用户只需要写一句简单的编译语句就可以了,大大提高了项目的工作效率。虽然它没有windows下的集成开发环境的界面好,但却有着异常灵活的自由度。对于一个专业人士来说,make的使用会更能提高项目的效率。
1. Makefile的基本结构
Makefile的编写规则。在一个Makefile中通常包括如下内容:a. 需要由make工具创建的目标体(target),通常是目标文件或可执行文件;b. 要创建的目标体所依赖的文件(dependency_file);c. 创建每个目标时需要的命令(command)。如下所示:
然后我们就可以使用make了。如:make hello.o。
这样Makefile执行了hello.o对应的命令语句,生成hello.o目标体。
2. Makefile变量
上例的Makefile在实际中是几乎不存在的,因为它过于简单,这种情况完全没必要编写makefile而只需要在shell中直接输入即可,而在实际中使用的makefile往往是包含很多的文件和命令的。例如:
在这个makefile中有3个目标体(target),分别是sunq、kang.o和yul.o,其中第一个目标体的依赖文件就是后两个目标体。如果用户使用make sunq则make管理器就是从sunq目标体开始执行。在检查kang.o、yul.o和sunq这三个文件的时间戳之前,他会向下查找那些把kang.o或yul.o作为目标文件的时间戳。比如kang.o的依赖关系为kang.c、kang.h、head.h。如果这些文件中的任一个文件的时间戳比kang.o新,则命令gcc -wall -o -g -c kang.c -o kang.o 将会执行。
为了简化编辑和维护makefile,make允许在makefile中创建和使用变量,用来代替一个文本字符串。这里变量的定义有两种方式,一种使递归方式,另一种是简单方式。递归展开式可以在变量中引用别的变量,它将在引用该变量是一次性内嵌的变量全部展开。虽然这种方式很好的完成用户的指令,但有可能导致展开过程无穷循环,例如引用自己的时候:CFLAGS = $(CFLAGS) -O
递归展开的方式定义格式为:VAR=var。
简单展开的方式定义格式为:VAR:=var。
经变量替换后的makefile如下所示:
Makefile中的变量分为用户自定义变量、预定义变量、自动变量和环境变量。上面的OBJS就是用户自定义变量。预定义变量包含了常见编译器、汇编器的名称以及编译选项。下面是makefile常见预定义变量
为了进一步简化makefile的编写,引入了自动变量。自动变量通常可以代表编译语句中出现的目标文件和依赖文件等。如下所示
这样上面的makefile文件就可以进一步简化为