Linux(Unix)中GNU make工具的简单使用(Makefile文件的简单使用)

GNU make工具

1.make工具简单介绍

make是一条计算机指令,是在安装有GNU Make的计算机上的可执行指令。该指令是读入一个名为makefile的文件,然后执行这个文件中指定的指令。
有时make又指GNU Make,GNU Make 是一个用来控制可执行文件和其他一些从源文件来的非源代码文件版本的软件。(援引自百度百科相关词条)

2.Makefile文件简单介绍

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile就像一个Shell脚本一样,也可以执行操作系统的命令。

Makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

3.Makefile文件的基本编写规则

TARGET … : DEPENDENCIES …
COMMAND …

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。
① prerequisites就是,要生成那个target所需要的文件或是目标。
② command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行(command一定要以Tab键开始,否则编译器无法识别command),从而减少重复编译,提高了其软件工程管理效率。

简单的Makefile文件编写示例:
在这里插入图片描述

假设main为最终的C程序可执行文件,其由main.o、input.o、output.o、cal.o四个目标文件统一生成,后者分别由main.c、input.c、output.c、cal.c四个C语言源程序文件编译得到,那么使用make工具统一编译运行四个.c文件的Makefile文件内容基本格式如图(clean是为程序成功运行后删除中间文件所写,可不添加)。

注:每条规则编写时,对应命令条数无限制,但必须以Tab键开始,否则无法识别为命令。

4.make工具的工作过程(转载链接

(1)make的退出码

make命令执行后有三个退出码:

0 —— 表示成功执行。
1 —— 如果make运行时出现任何错误,其返回1。
2 —— 如果你使用了make的“-q”选项,并且make使得一些目标不需要更新,那么返回2。

(2)指定Makefile

GNU make找寻默认的Makefile的规则是在当前目录下依次找三个文件——“GNUmakefile”、“makefile”和“Makefile”。其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。

我们也可以给make命令指定一个特殊名字的 Makefile。要实现这个功能,我们要使用make的“-f”或是“–file”参数(“–makefile”参数也行)。例如,我们有个 makefile的名字是“test.ccc”,那么,我们可以这样来让make来执行这个文件:

make –f test.ccc

如果在make的命令行是,你不只一次地使用了“-f”参数,那么,所有指定的makefile将会被连在一起传递给make执行。

(3)指定目标

一般来说,make的最终目标是makefile中的第一个目标,而其它目标一般是由这个目标连带出来的。这是make的默认行为。当然,一般来说,你的makefile中的第一个目标是由许多个目标组成,你可以指 示make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(如前面提到的“make clean”形式)

任何在makefile中的目标都可以被指定成终极目标,但是 除了以“-”打头,或是包含了“=”的目标,因为有这些字符的目标,会被解析成命令行参数或是变量。甚至没有被我们明确写出来的目标也可以成为make的 终极目标,也就是说,只要make可以找到其隐含规则推导规则,那么这个隐含目标同样可以被指定成终极目标。

有一个make的环境变量叫“MAKECMDGOALS”,这个变量中会存放你所指定的终极目标的列表,如果在命令行上,你没有指定目标,那么,这个变量是空值。这个变量可以让你使用在一些比较特殊的情形下。比如下面的例子:

sources = foo.c bar.c
ifneq ( $(MAKECMDGOALS),clean)
include $(sources:.c=.d)
endif

基于上面的这个例子,只要我们输入的命令不是“make clean”,那么makefile会自动包含“foo.d”和“bar.d”这两个makefile。

使用指定终极目标的方法可以很方便地让我们编译我们的程序,例如下面这个例子:

.PHONY: all
all: prog1 prog2 prog3 prog4

从这个例子中,我们可以看到,这个makefile中有四个需要编译的程序——“prog1”, “prog2”, “prog3”和 “prog4”,我们可以使用“make all”命令来编译所有的目标(如果把all置成第一个目标,那么只需执行“make”),我们也可以使用“make prog2”来单独编译目标“prog2”。

即然make可以指定所有makefile中的目标,那么也包括“伪目标”,于是我们可以根据这种性质来让我们的makefile根据指定的不同的目标来完成不同的事。在Unix世界中,软件发布时,特别是GNU这种开源软件的发布时,其makefile都包含了编译、安装、打包等功能。我们可以参照这种规则来书写我们的makefile中的目标。

“all” :这个伪目标是所有目标的目标,其功能一般是编译所有的目标。
“clean” :这个伪目标功能是删除所有被make创建的文件。
“install” :这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。
“print” :这个伪目标的功能是例出改变过的源文件。
“tar” :这个伪目标功能是把源程序打包备份。也就是一个tar文件。
“dist” :这个伪目标功能是创建一个压缩文件,一般是把tar文件压成Z文件。或是gz文件。
“TAGS” :这个伪目标功能是更新所有的目标,以备完整地重编译使用。
“check”和“test” :这两个伪目标一般用来测试makefile的流程。

当然一个项目的makefile中也不一定要书写这样的目标, 这些东西都是GNU的东西,但是我想,GNU搞出这些东西一定有其可取之处(等你的UNIX下的程序文件一多时你就会发现这些功能很有用了),这里只不过 是说明了,如果你要书写这种功能,最好使用这种名字命名你的目标,这样规范一些,规范的好处就是——不用解释,大家都明白。而且如果你的makefile 中有这些功能,一是很实用,二是可以显得你的makefile很专业(不是那种初学者的作品)。

5.make的简单上手实例

(1)编写C程序文件exercise.c

exercise.c(读取指定文本文件内容并输出,类Linux中cat命令):

#include<stdio.h>

int main(int argc,char *argv[])
{
        FILE *fp = fopen(argv[1],"r");
        int read_ret;
        if(argc<2)
        {
                printf("please input the source file!\n");
        }
        if(fp == NULL)
        {
                printf("open source %s failed!\n",argv[1]);
                return -1;
        }
        while(1)
        {
                read_ret=fgetc(fp);
                if(feof(fp))
                {
                        printf("read file %s successfully!\n",argv[1]);
                        break;
                }
                fputc(read_ret,stdout);
        }
}

(2)编写Makefile文件

Makefile具体内容:
在这里插入图片描述

(3)make工具编译源程序,生成可执行文件main,并运行测试

以新建文本文档test.txt进行结果测试:

(4)执行其余目标命令

在这里插入图片描述

6.make工具的简单使用小结

make工具对于GNU下编译执行程序源文件等非常实用和方便,且对于管理较大规模的文件系统有非常好的效果,可以减少许多不必要的麻烦,多多上手使用make编译器工具对于高效的进行Linux系统学习甚至其他IDE的开发都有一定的帮助。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值