现在的位置: 首页 > 云计算 > 正文

什么是Makefile文件?

2020年02月06日 云计算 ⁄ 共 1792字 ⁄ 字号 评论关闭

  很多 Linux(Unix) 做开发的初学者不了解 Makefile 是什么,甚至大部分 Windows 开发工程师对 Makefile 都特别陌生。这个其实很正常,如果你是在 Windows 下作开发的话不需要去考虑这个问题,因为 Windows 下的集成开发环境(IDE)已经内置了 Makefile,或者说会自动生成 Makefile,我们不用去手动编写。

  Linux 中却不能这样,需要我们去手动的完成这项工作。Linux 下可以做的开发语言有很多,我们常见的 C/C++语言、python、java 等等。如果我们相要在 Linux(Unix) 下做开发的话,不了解 Makefile 是一件非常失败的事情,甚至说你就成为不了一个合格的 Linux 开发工程师。不会 Makefile,就操作不了多文件编程,就完成不了相对于大的工程项目的操作。如果想在 Linux(Unix) 环境下做开发的话,Makefile 是我们必须掌握的一项技能。

  什么是 Makefile 呢?

  Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,我们在 Makefile 中都可以进行描述。换句话说,由了 Makefile 可以使得我们的项目工程的编译变得自动化,不用每次都手动输入一堆源文件和参数。

  我们以 Linux 下的C语言开发为例来具体说明一下,多文件编译生成一个文件,我们编译的命令如下所示:

  gcc -o outfile name1.c name2.c ...

  outfile 要生成的可执行程序的名字,nameN.c 是源文件的名字。这是我们在 Linux 下使用 gcc 编译器编译 C 文件的例子。如果我们遇到的源文件的数量不是很多的话,我们可以这样去编译的。但是如果我们源文件非常的多的话,我们就会遇到下面的这些问题。

  1) 编译的时候需要链接库的的问题。我们那拿C语言来说,编译的时候 gcc 只会默认链接一些基本的C语言标准库,很多源文件依赖的标准库都需要我们手动链接。

  下面列举了一些需要我们手动链接的标准库:

  name1.c 用到了数学计算库 math 中的函数,我们得手动添加参数 -Im;

  name4.c 用到了小型数据库 SQLite 中的函数,我们得手动添加参数 -lsqlite3;

  name5.c 使用到了线程,我们需要去手动添加参数 -lpthread。

  因为有很多的文件,还要去链接很多的第三方库。所以在编译的时候命令会很长,并且在编译的时候我们可能会涉及到文件链接的顺序问题,所以手动编译会很麻烦。

  如果我们会使用 Makefile 就不一样了,它会彻底简化我们的操作。可以把要链接的库文件放在 Makefile,制定相应的规则和对应的链接顺序。这样我们只需要执行 make 命令,工程就会自动编译。每次想要编译工程的时候就执行 make ,省略掉我们在手动编译中的参数选项和命令,非常的方便。

  2) 编译大的工程会花费很长的时间。

  如果我们去做项目开发,免不了要去修改工程项目的源文件,每次修改后都要去重新编译。一个大的工程项目可不止有几个的源文件,里面的源文件个数可能有成百上千个。例如一个内核,或者是一个软件的源码包。这些都是我们做开发经常会遇到的。要完成这样的文件的编译,我们消耗的时间可不是一点点。如果文件特别大的话我们可能要花上半天的时间。

  对于这样的问题我们 Makefile 可以解决吗?当然是可以的,Makefile 支持多线程并发操作,会极大的缩短我们的编译时间,并且当我们修改了源文件之后,编译整个工程的时候,make 命令只会编译我们修改过的文件,没有修改的文件不用重新编译,也极大的解决了我们耗费时间的问题。

  这其实我们遇到的相比较来说比较常见的问题,当然我们遇到的问题还会有很多,比如:

  我们的工程文件中的源文件的类型不止一种,编译的话需要选择的编译器。

  我们的文件可能会分布在不同的目录中,我们需要查找。

  这些问题我们都可以通过 Makefile 解决。并且我们文件中的 Makefile 只写一次就行,一般我们只要不增加或者是删除工程中的文件,Makefile 基本上不用去修改,编译时只用一个 make 命令。为我们提供了极大的便利。有助于提高我们的效率。

抱歉!评论已关闭.