《跟我一起写Makefile》读书笔记(1)

以下内容源于陈皓所写《跟我一起写Makefile》的学习和整理,如有侵权,请告知删除。


一、概述

(1)makefile的作用,类似于windows中的IDE工具的功能;

(2)makefile 关系到整个工程的编译规则

  • 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。
  • 甚至于进行更复杂的功能操作,因为makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。
(3)makefile 带来的好处就是——“自动化编译”
  • 一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。

二、关于程序的编译和连接


(1)源文件经过编译器的编译,生成中间目标文件(.o文件,即Object File
  • 在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成 Object File。
(2)中间目标文件经过链接器的链接,生成执行文件(.elf文件)
  • 一般来说,每个源文件都应该对应于一个中间目标文件(O 文件或是 OBJ 文件)。
  • 链接时,主要是链接函数和全局变量 。
  • 由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在 Windows 下这种包叫“库文件”(Library File),也就是 .lib 文件,在 UNIX下,是 Archive File,也就是 .a 文件。
附加说明:

(3)由.elf文件得到可以烧写的镜像文件
  • 链接器所得到.elf文件是可执行程序(在操作系统下,此.el文件可以执行);
  • 但在嵌入式裸机中,我们需要的是可以烧写的文件(可烧写的文件就叫镜像image);
  • 因此我们需要用这个.elf为原材料来制作镜像,制作工具是交叉编译工具链中的arm-linux-objcopy
(4)由.elf文件反汇编得到汇编程序,见博客点击打开链接
  • 使用arm-linux-objdump工具进行反编译(反汇编);
  • 把编译后的.elf格式的可执行程序反编译,得到它的汇编源代码。
  • 我们使用反汇编主要是用来学习。


(4)Makefile文件中把编译和链接的过程分开。

  • 用gcc a.c -o exe这种方式来编译时,形式上把编译和链接过程一步完成了。
  • 但是在内部实际上编译和链接永远是分开独立进行的,编译要使用编译器gcc,链接要使用链接器ld。

三、Makefile的介绍

1、makefile的规则

target ... : prerequisites ...
command

(1)如果prerequisites中有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行。这就是 Makefile 的规则。也就是 Makefile 中最核心的内容。

(2)命令前一定要以一个 Tab 键作为开头。

(3)“目标:”后面如果没有依赖

  • 那么,make 就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。
  • 要执行其后的命令,就要在 make 命令后明显得指出这个lable 的名字。
  • 这样的方法非常有用,我们可以在一个 makefile 中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

2、makefile是如何工作的?

  • make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  • 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make 就会直接退出,并报错;
  • 对于所定义的命令的错误,或是编译不成功,make 根本不理。


3、makefile中使用变量

这类似于shell中定义变量,然后使用$来引用


4、makefile的自动推导

《跟我一起写Makefile》读书笔记(1)

.PHONY修饰clean,表示clean是一个伪目标


5、清空目标文件的规则

如上,每个Makefile中都应该写一个清空目标文件(.o 和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁