GNU make(一):GNU make概述
一、GNU make概述1. GNU make是什么?GNU make是Linux环境下著名的工程构建和管理工具,使得我们可以使用一个命令就完成编译、链接以至于执行,自动地帮我们完成构建工作。目前,大量的C/C++项目使用make作为工程构建工具,大量的IDE使用与make相同的工程构建策略。 2. GNU make如何工作?Make的本质是一个解释器,用于解释一种名为Makefile的脚本。这个Makefile脚本告诉make以何种方式编译源代码和链接程序。从本质上来看,make通过比较相关文件的最后修改时间,来决定哪些文件需要更新,哪些文件不需要更新,之后执行以下操作:
二、Makefile简介编写Makefile脚本是一项相对复杂的工作,它有自己的书写格式、关键字和函数。而且,在Makefile脚本中可以使用宿主操作系统所提供的任何Shell命令来完成想要完成的操作。 1. Makefile的规则介绍在Makefile中,规则是最重要的组成部分,通过定义一条或多条规则来描述文件如何被生成。Makefile一个最基本的Makefile规则如下所示: # 这里是单行注释。 Target : Pre[1] Pre[2] ... Pre[N]; Command[0] Command[1] Command[2] ... Command[M] 其中所包含的主要成员如下:
在所有的规则中,默认的第一个规则的目标为最终目标,也就是make默认生成的目标;如果第一个规则是一个多目标规则,那么第一个目标被作为最终目标。 当然,Makefile中通常还包含了除了规则之外的很多东西(后续我们来展开讨论)。但无论它怎样复杂,它都符合以上介绍的最基本的格式。 2. make如何解释规则(1) make判断需要生成目标的依据当make进行维护工作时,它按照如下顺序检查是否需要生成目标:
同时,对于规则,make还具有以下特性:
(2) make维护的抽象数据结构当make解释器发现了一条规则时,它将按照顺序读取其目标、依赖和所有命令,然后维护一个数据结构来存储它们。这个数据结构的实现各有不同,但是为了帮助理解上面的特性,我们可以按照下面的样子来抽象并理解它: 其中,所有的依赖和目标组成了一个循环链表,而所有的命令是一个单链表。当make发现需要维护一个目标时,它将进行以下工作:
3. 如何执行make在终端执行
如果没有使用-f选项,那么make程序执行默认的缺省选择:
三、编写一个最简单的HelloWorld脚本作为HelloWorld脚本,它应该尽可能地简单。因此,我们不生成任何文件,仅仅让其在终端输出字符串即可。 【示例】:一个最简单的Makefile脚本 # Makefile HelloWorld: echo "hello,world" 在这个Makefile脚本中,我们仅编写了一条规则:HelloWorld,它不具有任何依赖,并且只有一条命令:
【运行结果】: [[email?protected] 0000]$ make echo "hello,world" hello,world [[email?protected] 0000]$ make -f Makefile echo "hello,world [[email?protected] 0000]$ make HelloWorld echo "hello,world [[email?protected] 0000]$ make -f Makefile HelloWorld echo "hello,world 四、使用make来编译代码【示例】:使用make来维护代码 /* * foo.h */ #ifndef _FOO_H_ #define _FOO_H_ void foo(); #endif /* * foo.c */ #include <stdio.h> #include "foo.h" void foo() { printf("hello,makefilen"); } /* * main.c */ #include "foo.h" int main(int argc,char *argv[]) { foo(); return 0; } # Makefile HelloMakefile.elf: main.o foo.o gcc -o HelloMakefile.elf main.o foo.o main.o: main.c gcc -c main.c -o main.o foo.o: foo.c gcc -c foo.c -o foo.o 【运行结果】: [[email?protected] 0000]$ ls foo.c foo.h main.c Makefile [[email?protected] 0000]$ make gcc -c main.c -o main.o gcc -c foo.c -o foo.o gcc -o HelloMakefile.elf main.o foo.o [[email?protected] 0000]$ ls foo.c foo.h foo.o HelloMakefile.elf main.c main.o Makefile [[email?protected] 0000]$ ./HelloMakefile.elf hello,makefile (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |