Makefile教程
-------作者:陈颢文
====================================================
由于水平有限,文档中难免有错误的地方,希望大家踊跃提出。
一、Makefile简介
什么是Makefile?很多做windows的程序员都没有听说过这个东东。因为windows的很多开发环境中都已经帮你做了这些东西了。但是如果你想要才成为一个专业的认识,或者需要在我们的Linux系统中编程的话,你就需要了解我们的Makefile。Makfile,又有人把它称为“工程管理器”,它的作用主要是用来在我们的工作管理中指定一系列规则,规定我们哪些文件需要优先编译,哪些文件需要后编译,哪些文件需要重新编译。对与一个team来说,我们做一个项目,每个人都是做了一个部分。当我们所有人写的程序放在一起的时候,我们就需要指定哪些东西先执行,哪些文件后执行。只有这样才能够实现我们想要的功能。本文默认使用的是我们的LINUX系统下的GCC编译器。
二、Makfile的工作
(1)前言
在我们学习任何语言的时候,我们都是从一个”hello world”的文件开始学习起来的。虽然我们的Makefile不是一门编程语言。但是,为了更好的学习,我们就来看看,如何通过Makefile来输出一个hello world。
<1>进入ubuntu系统中新建一个Makefile文件
<2>输入我们要写的”hello world”的内容
注意:echo “hello world”前面不是空格而是TAB键
<3>运行我们的Makefile
好了,完成了上述操作之后,可能大家还是一头雾水,不知道为什么要这么写,下面我们分析下,我们写的内容。
在我们的Makefile中第一个很重要个概念就是目标。顾名思义,目标就是我们make运行时候需要寻找的对象,在上图中就是all.
目标放在我们的”:”之前,它可以由字母和下划线”_”组成。
echo “Hello world”我们称为生成目标的命令。
all目标的定义,其实就是定义了如何生成all目标,我们称之为规则。例如,上图就是我们Makefile中定义了一个生成all目标的规则。
那我们之后的运行的make又是一个什么东西呢?不要急,我们先看看。下面几种运行方式。
make + 目标 运行我们的Makefile程序
第一种运行方法,不指定目标,默认生成我们的第一个目标
第二种运行方法,告诉make工具,我们生成all目标
第三种运行方法,默认make为我们生成test目标,由于我们根本没有定义test目标,所以运行结果是可想而知的。make报错,找不到目标。
(2)我们来增加多个目标看看
运行结果:
好,由上面的运行结果我们可以得到一下信息:
<1>一个Makeifle可以定义多个目标
<2>我们调用make命令时,默认运行第一个目标
这里大家觉得我们的echo “Hello world”似乎输出了不好看啊!于是,我们也可以这样来修改一下。
@------它的作用是告诉make,在运行时不要将这一行命令显示出来。更改之后相应的运行结果如下。
好了,若是我们想要让”hello world”和”Just for test”都输出来该怎么办呢?
我们来运行看看
好了,这个时候我们就要正式的说说我们的Makefile了。
(3)Makefile的构建规则
目标(Target):先决条件(prerequisites)
<TAB键> 命令
如上图中Makefile中的内容
目标--------->all
先决条件--------->test
命令--------------->echo “Hello world”
详解:目标与先决条件之间表达就是依赖关系。这种依赖关系指定在构建目标之前,必须先满足先决条件先满足。而先决条件一般常为其他的目标。因此,在构建我们当前目标的时候,它的其它目标一般需要先被构建出来。
因此,我们就可以来写一个简单的Makefile了。
head.h
add.c
sub.c
main.c
我们首先自己来运行看一下:
好了,我们自己来写一个Makefile来看看。
运行结果: