当前位置:文档之家› makefile新手教程

makefile新手教程

makefile新手教程
2013-11-08
本文翻译自/tutorials/
Makefiles
--通过示例说明
编译源代码是沉闷的,尤其是当你想要include一些源代码,却又每次都需要手动敲编译命令的时候。

恩,我有个好消息告诉你...你用手敲命令行去编译的日子(基本上)一去不复返了,因为你将会学习如何编写Makefile。

Makefile是配合make命令使用的特殊文件,make命令则会帮助你自动地、神奇般地管理你的工程。

这里你需要先准备以下文件:
main.cpp
hello.cpp
factorial.cpp
functions.cpp
我建议你新建一个空的目录,然后将上述4个文件放入其中。

注意:我使用g++命令编译。

你完全可以换成别的编译器
make工具
如果你运行make 它会去寻找当前目录下名字为makefile的文件,并按里面的内容执行。

如果你有很多makefile文件,那么可以用这个命令来执行:
当然还有其他的参数来使用make工具,详情请man make。

构建过程
1.编译器编译源代码文件,输出到目标文件
2.链接器将目标文件链接,并创建可执行文件
手动编译
手动编译并获得可执行文件,是一种琐碎的方式:
基本的Makefile
基本的makefile文件组成如下:
将此语法应用到我们的例子中,就是: all: g++ main.cpp hello.cpp factorial.cpp -o hello 我们将此文件保存为Makefile-1。

要运行此makefile,则输入:make -f Makefile-1 在这个例子中可以看到,我们的target叫做all。

这是makefile中的默认target。

若无指定参数,make工具将按这个target 执行。

我们同时发现,这个例子中的target,也就是all,没有dependencies(依赖文件),因此make会安全地执行后续的system commands(系统命令)。

最后,make根据我们设定的命令完成了编译。

使用依赖文件
有时候使用多个不同的target会很有用,因为当你只修改了工程中的一个文件时,不必重新编译所有代码,只需要编译修改过的部分。

比如:
点此下载
我们发现目标all只有依赖关系,没有系统命令。

为了让make命令正确执行,需要保证能满足所调用target的依赖关系(本例中是all)。

所有target中的依赖项都会被搜索,并且一旦发现,就会执行后续的系统命令。

本例中,我们有一个target叫做clean。

当想要快速除去所有目标文件和可执行文件时,它将很有帮助。

使用变量和注释
当编写Makefile时,可以使用变量。

当你想要更换编译器或者编译选项的时候,将会很方便。

正如你所见,变量有时很有用。

要使用它们,只需在开始写target之前为其赋值。

然后,使用$(VAR)的形式表示对应的值。

接下来怎么做
通过上面对Makefile的简短介绍,你可以在工程中创建十分复杂结构。

然而,这只是冰山一角。

我并不期望谁能在不查询Make documentation的情况下,能完全理解下面给出的例子(当然,我自己也不得不查看了一下这个文档。

或者可以查看Unix book中347到354页)。

点此下载
如果理解了最后这个例子,那么只需修改其中两行就可以用于任意工程了,无论添加了什么额外的文件!
说明:$<表示cpp文件,$@表示目标文件,所以修改上述代码4、6两行,分别改为你的工程中的源代码文件和生成目标,就可以使用了!。

相关主题