Linux之Ubuntu入门 (四)

4 篇文章 1 订阅
4 篇文章 0 订阅


初识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多文件编译入门视频

点击此处观看


第一个多文件编译实验

  1. 实验目的
    掌握通配符和makefile的基本语法,初步体验多文件编程
  2. 实验工具
    一台可以联网的电脑,一台安装Ubuntu系统和gcc工具的云服务器(可参考如何申领一台免费的云服务器
  3. 实验过程

(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

这一段脚本大量使用了通配符,建议先看完前面提到的视频再来理解。看完视频以后相信你们也能给出这段脚本的注释了。同学们可以试着使用英文注释,这是一个好习惯。


作者的话

小白看完教程可以跟着尝试一下。软件的学习一定要多上手,只有当你把完整的过程能够在你的服务器上复现之后,才能说明你真正掌握了。加油!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盛世危言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值