Linux入门之Ubuntu(四)
初识Makefile和make
Makefile算是一种脚本,建立makefile文件可以帮助使用Linux的程序员完成多个C源文件的多文件编译。Makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。
make是一个命令工具,它解释Makefile 中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。本文初步介绍一下最简单的makefile文件应该如何构建。
Makefile基础知识
Makefile里主要包含了五个东西:变量定义、显式规则、隐晦规则、文件指示和注释。
1、变量的定义
在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
2、显式规则
显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。 刚才写的疑似shell脚本的Makefile全部都是显示规则。
3、隐晦规则
由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
4、文件指示
其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样。
5、注释
Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符。
Makefile与C语言的多文件编译
小白请先点击观看下面的教程视频
Makefile多文件编译入门视频
第一个多文件编译实验
- 实验目的
掌握通配符和makefile的基本语法,初步体验多文件编程 - 实验工具
一台可以联网的电脑,一台安装Ubuntu系统和gcc工具的云服务器(可参考如何申领一台免费的云服务器) - 实验过程
(1)新建一个文件夹
$ mkdir ex1 //新建ex1文件夹
(2)进入文件夹
$ cd ex1
(3)建立分别实现加减乘除运算的四个C源文件和输出运算结果的main文件
$ vi add.c //新建加法的C源程序
$ vi sub.c //新建减法的C源程序
$ vi mul.c //新建乘法的C源程序
$ vi div.c //新建除法的C源程序
$ vi main.c //新建main的C源程序
举两个C源文件的例子
加法的C源文件
int add(int x, int y)
{
return x + y;
}
main的C源文件
#include"head.h"
int main()
{
int a, b, c, d;
a = add(10, 5);
b = sub(10, 5);
c = mul(10, 5);
d = div(10, 5);
}
我想但凡有过C编程经历的同学应该已经发现了这两个源程序都是有问题的。首先C的库里没有名为head的头文件,这里也没有我们写C代码经常用到的stdio.h头文件。这样的代码在IDE里是绝对编译不过的。但是使用makefile就可以,接下来我们继续。
(4)创建head.h头文件
$ vi head.h
编写head,h头文件
#include"stdio.h"
int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);
接下来我们可以写我们的makefile文件了
(5)编写Makefile文件
$ vi Makefile
TAR = test
# Define a macro for the object file
OBJ = main.o add.o div.o mul.o sub.o
# Define macros for name of compiler
CC := gcc
CFLAGS = -c
$(TAR):$(OBJ)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
# Transfer all c file into executable file
rm -rf $<
.PHONY:
clearall:
rm -rf $(OBJ) $(TAR)
# Remove all object file
这一段脚本大量使用了通配符,建议先看完前面提到的视频再来理解。看完视频以后相信你们也能给出这段脚本的注释了。同学们可以试着使用英文注释,这是一个好习惯。
作者的话
小白看完教程可以跟着尝试一下。软件的学习一定要多上手,只有当你把完整的过程能够在你的服务器上复现之后,才能说明你真正掌握了。加油!