当前课程知识点:互联网体系结构 >  第二周:Socket网络编程 >  编译、构建和调试 >  Video

返回《互联网体系结构》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《互联网体系结构》慕课在线视频列表

Video课程教案、知识点、字幕

当程序复杂的时候

我们做起来还是gcc

还是不够方便

对吧不方便

这时那我们需要用其他的构建工具

对我们用的比较多的就是

他这make是一个命令工具,是一个解释

makefile指定的命令工具

一般来说呢

就是大多数的IDE都有这个命令

所以就是GNU的make

GNU的make呢

就是实际上其他的IDE的开发工具大多都是参考GNU的

make是吧

delphi下面有个make

visual c++

linux下的GNU有make对吧

我们用的就是linux的make

就是make命令执行时需要

一个就是makefile文件可以告诉make命令怎样去编译和链接程序

也就说我们前面通过gcc手工做的那些工作

我们都可以把它写在makefile里边

由make自动的来执行的是吧

自动来执行

这就是所谓的makefile

那我们就认为是工程文件

当然你通过

就是visual c++或者其他的IDE

它都有对应的工程文件

只是那个工程文件的往往是用图形化界面

我通过菜单的方式来自动生成的对吧

但是我们的makefile文件

往往是作为我们代码的一部分,手工写的,就是

但是它的作用是基本上差不多的是吧

作用是基本一样

恩就他这个工程文件的主要的作用的话

他就是一个是这个工程

没有被编译过

他是一个源代码

只是源代码

那么我们的所有C文件都要编译并被链接

如果这个工程文件

我们之前编译过只是某几个C文件被修改了

那么我们只编译被修改的C文件

并链接成目标程序

还有呢

就是如果这个工程

这工程中的头文件被修改了

那么我们需要编译引用这几个头文件的C文件并链接目标程序

也就是说

这个make和这个工程文件,makefile,它可以智能地帮我们选择性的编译对吧

这样他可以大大的节约构建的时间是吧

而不是我们全部都重读编译每次都重编译

所以make呢

他是相当于是一个自动化的构建工具

但是如果你是java

用现在的nodejs等等

他都有一整套的叫做持续集成

构建编译

调试和部署等等哈

但现在的工具会更加庞大

更加复杂一些吧

使用起来更便捷

但是在linux下

我们用的这个make还是一个基本功

我们还是要了解执行

再加上这些之后我们学其他的语言包,nodejs,java等等

持续集成的概念

这些工具及有很多庞大的工具集

但是我们的这边的还是linux基础就是我们讲的还是最基本的

在linux下

gcc make

那我们接下来看一些工程文件

该怎么写

make他的规则

他的规则,实际上就是还是比较简单的

他有一个target

加冒号

然后呢

有一些前置的条件

下面呢

就是tab

commands

可以是

可以有很多

有很多命令

这些命令的都可以是任意的shell命令

这就是我们为什么这一节课讲makefile,上一节课讲shell

因为就是shell命令

有一个基础

那我们在写makefile的时候呢

就更方便一些

但是这两者呢

是有makefile

里面是有一些shell命令对吧

他是调用shell

但是那是整个makefile呢

是由make命令执行的

而shell命令呢

是由bash执行的是吧

所以它相当于是,make makefile

是在shell bash脚本上一层是吧

对,就是shell脚本和bash这些的工具进一步的封装,用于我们的就是

就是项目的构建是吧

下面的构建专门用于项目

同样我们bash和shell脚本

我们还可以用于很多其他的领域对吧

但都算是一个自动化的就是脚本语言工具

这个makefile呢

可以认为是shell脚本的一种应用

make就是相当于是在bash这个解释脚本语言的工具之上

我们又做了一个专门针对程序构建了一个工具

make

这个就是我们这么来看的话

我们这是他的基本的规则是这样

但是这些规则那我们还是要具体看他的

规则的含义是什么啊

我们先来就是看

这是make的一个是他是如何工作的

这个规则是怎么工作的

make可能会在当前目录下找名字叫

但也有一个GNU makefile

他会找这些

就是这个特定名字的这个文件

如果make命令运行

是没有指定目标默认会执行

makefile的第一个目标

一般的第一个目标的

我们习惯于写为all

make会一层一层地找这个目标的依赖关系是吧

目标的前置依赖的执行完之后,再执行该目标下的command什么意思

那就是当我们执行某个target的时候

我们先看看前置的依赖条件是不是都被执行过

执行过完成之后才能执行这个target下面的command,make是帮我们把他构建起来了

是吧makefile构建起来

我们可以简单看一下这个makefile

这个makefile

#是注释

然后呢

这边的我们定义了一些变量

定义了一些变量

然后第一个目标

第一个目标是all

他的依赖于object变量

这个变量的就是这些.o文件

是吧

他依赖于.o

然后呢

我们使用这个cc

然后呢

并把这些.o链接成可执行文件

target对吧

这些目标文件呢

有.c .o

待会我们具体讲它是什么意思啊

他负责把每一个.o文件对应的.c文件编译成.o文件

最后还有一个clean

那就是帮我们把编译好的中间文件就是把它清理一下

项目清理一下

像我们可以去看一下

当前这个文件里面多了一些.o和可执行文件

就可以把它清理掉

就把它清理掉

你就变成一个干净的源代码

也就说有了make和makefile之后

我发现我们编译程序不需要直接用gcc了

是吧

他变得非常简单

一些啊

那我们看

其实具体他是怎么工作的

首先是目标,一个目标的构成一条规则,目标的通常是文件名指明make命令所要构建的对象目标

可以是一个文件名也可以是多个文件名,之间用空格分隔

目标还可以是某个操作的名字

这个称为伪目标

对吧

伪目标

比如clean

如果当前目录中的正好有个文件叫clean

那么这个目标呢

不会被执行

因为make发现clean文件已经存在

就是没有必要重新构建,就不会执行这个clean伪目标

为了避免这种情况

可以明确声明clean为伪目标

还有一个

就是声明clean为伪目标

目标和伪目标

然后前置条件

前置条件通常是一组文件名,之间用空格分隔,他指定了目标是否

重新构建的判断标准,就是只要有一个前置文件不存在或者有过更新

就是他这更新的

就是前置文件的最后一次修改的时间戳比目标文件更新

那也就是这涉及到我们前面讲的文件属性了是吧

文件属性也就是我们

他会就是make会自动的比对

会自动的比对

当前的这个目标文件的时间戳也就是他的属性

里面的修改日期是吧

就把日期和就是所有的

和他源文件比哪一个更新对吧

如果这个源文件更新的话

那么他就会比这个目标时间戳新的话,就是目标就需要重新构建

它是通过一个智能的判断

命令还有拿这个前面条件和命令

如果表示如果更新目标文件

由一行或多行的shell命令组成,它是构建目标的具体指令

他的运行结果

通常是生成目标文件

每行命令之前的必须有一个tab

如果想用其他键

可以内置变量

这时这地方需要特别说明一下

因为makefile我们使用一个集成开发工具的时候

因为我们习惯于把这个代码的tab换成四个或者八个空格的方式来替换

但是呢

有时候就是这个make

它不支持使用空格的方式的对吧

如果你就是需要把它变成空格的话

这地方你需要在这个范围里面需要指明

我这makefile不是使用tab

而是使用四个空格对吧或者是使用其他的符号

比如说>来替代

否则的话

你说是默认他是tab

你如果这个我们用的集成开发工具

它会自动整理代码的时候

把makefile前面的tab

切换成四个空格的话

他会有这个make在执行的时候他会出错

这是一个可能

其实有小伙伴可能用其他集成开发工具的时候,可以发现我写的makefile怎么

怎么执行都有错了

是吧

可能就是这tab有问题啊

这地方还有一个呢

就是每行命令

他都是在单独的一个shell执行

这个是这些shell之间没有继承关系

没有继承关系

因为大都是孤立的命令啊

这个

回头我们遇到再说,makefile的语法,#表示注释

正常另外用的make会打印每条命令

然后执行这个呢

叫做回声echo回声

在命名前面

再加上@就表示关闭回声

他执行的每条命令

它会显示出了还有通配符

用来指定一组符合条件的文件

makefile的通配符

和bash基本上是一致的

有星号问号等等哈

比如说*.o表示所有的后缀有.o的文件

这些和makefile是一致的

还有一个就是模式匹配,因为make允许

对文件名进行类似正则运算的匹配

主要用到的匹配阻隔就是百分好对吧恩

我们就是假定

当前目录有f1f2两个

那么需要他们编译为对应的对象文件

那么就是.o

目标有通配符

目标是用通配符的,是通配符% .o

然后冒号

这些.o依赖于通配符 % .c

他是这么依赖

那么就是这样的

他就简写为.c.o

我们刚看这个代码

他就.c.o

他实际上,.o依赖.c,对应的.c使用通配符呢

可以将大量的同类型的文件只用一条规则就完成

估计可以写的很简化啊

通配符

变量和赋值

我们看到我们那个范例可以看到有很多变量使用等号

自定义变量

调用变量需要放在就是一个$加括号之中

比如说我们这地方有一个

我们定义了一个变量

这个txt就需要$符加括号

调用shell变量

需要在$前加一个$

再加一个$

也就是shell变量的需要

而加就是两个$

shell变量

比如说我们希望得到当前shell目录

我们叫echo

我们试一下

这些命令可以看一下

比如说我们

这些指令我们试一下

比如说我们刚刚

如果我们想试一下刚刚的命令的话

我们可以

在这试一下对吧

比如说echo

$home对吧

我还可以

就是echo我们定义的变量

比如前面我们定义了一个OBJ

对吧

这两个echo呢

我们这时候再执行

也会发现

他就是

echo home对吧

echo home就打印了这么一个当前目录

然后呢echo

输出这么一个东西对吧

但是这个echo拼错了

echo拼错了

那我们第二个echo

错了

把它改一下

我们这时再执行一下

我就可以看到这个echo

这两个

这是我们的变量和赋值

当然我们还可以

变量的值可以指向另一个变量对吧

我们这边没有没有定义这种方式的,就是变量

比如v1是用v2来赋值的

这种情况呢

就是会复杂一点的话就是变量

因为就是他是个脚本

里边他这个var什么时候给它赋值的

会复杂一点

这地方涉及到的几个赋值运算符

比如说等号

他是在执行时扩展

允许递归扩展

也就是他在执行

刚刚的这个这个v1等于v2

这个变量是吧

我们用v2给它赋值的话

我们直接使用的直接用的等号

在等号呢

他就是在使用唯一这个变量的时候

才讲v2当时的值

赋给他还是允许递归扩展的是吧

那如果我们在这里等后面加冒号

也就是在定义时扩展

也就说v1在声明这个v1的时候就v2当时的值是多少

直接赋给他在定义时扩展

还有呢

就是加问号等于value

只有在该变量为空时才设置值

也就是让v1就是为空时

但这时v2赋给他

还有在内核编译里面会经常有+

因为就是我们能变量

我们把新的值加到变量的尾部

这是几个赋值运算符号

就是我们大致了解一下

见到的时候认识了吧

还有一些内置变量,make命令提供了

一系列的内置变量主要是这个

主要是为了跨平台的兼容性是吧

比如说我们用$CC指向当前使用的编译器是吧

但是我们就是那个里面让我们专门定义了CC对吧

为的也是跨平台的考虑

就是我们当跨平台的时候

我们可以指明使用哪个编译器

比如make指向当前使用的make工具

这都是内置变量

内置变量

有一个清单

我们提供了二维码

也可以扫码

可以看一看

还有一些呢

自动变量这个就比较

看起来这个,看到代码

读不懂是吧

感觉他很神奇的代码

那它里面会有一些自动变量

这当然就是那个shell脚本里面也有一些也有类似的

但是这地方,我们看一下可以了解一下,一个是$

他这个自动变量都是以$开头

也就是说这个呢

就是这个自动变量吗

在make

我们可以想象一下make在执行的时候

碰到这个他就会自动的去比较这些前置条件和目标

他的文件时间戳对吧

哪一个更新

就是更新的

比目标更新的

我们都帮他列出了对吧

前置条件的就是第一个前置条件的目录名

这个文件名也就

$(

就是类似的自动变量

也要有清单

扫码进一步的了解

我们这只是简单的熟悉这些东西

当然呢

他和上次课刘老师讲的shell脚本编程是一致的

所以那他makefile

那你可以就认为是一种特殊的bash

shell脚本

再说这地方

那他支持bash语法的一些判断和循环

比如说判断

这个变量

cc和gcc是不是相等

如果相等的话

他这个libs给他赋值

如果不是用gcc

他们就用normal libs

赋值就是if else

他最后

还有判断和循环

这地方就是有两个,一个就是for循环,两种用法

我们定义了一个list

有123

我们这里面呢

我们用来斜杠斜杠表示这几行这三行表示就是在同一个bash执行对吧

因为makefile make执行shell脚本的时候

他都是每一行在一个独立的就是shell里面执行

我们就是如果要执行

这种循环的话就需要加上

就是斜杠表示呢

他是这一行还没有结束

我们这个

这个就不需要对吧

就是因为

他们之间没有互相依赖关系,之间可以独立的执行

而这个for循环的

因为它用到i

就是第一行和echo

这个i他就是

需要依赖这个就是shell

当前的就是环境

是吧

当前环境下的i变量

所以呢

同样的我们也可以用

就是把这个list变量用一个列表的方式123

这两种方式都可以就是循环后判断

同样makefile

也可以使用函数

对他的格式就是$

或者是

shell就是函数

用来执行shell命令

比如说就是我们这儿有个

shell是一个特殊的函数

对吧我们可以自定义function

但是我们也可以用就是shell里面的函数吧

就是shell脚本中的就是bash语法里面的函数已经定义的

这时候那我们就要有几个shell关键词

这样echo是吧

比如说用echo函数shell一个

这是内置的函数

也有一些也有个列表啊

这我们只是简单了解一下

如果要写这个

如果要写这个实际的makefile

或者是shell脚本的话

我们可以还需要更复杂的

那我们这里看一个makefile的实例

我们这是一个清理项目的一个实例

比如说就是phony

他是删除不同的

就是把所有的程序删除吧

把这几个目标

都删除

互联网体系结构课程列表:

第一周:互联网概述

-课程内容简介

--Video

-网络协议基础

--Video

--Video

--Video

--Video

-上网浏览网页背后的网络通信过程

--Video

--Video

-实验环境安装配置

--Video

-网络相关命令

--Video

--Video

-本周作业

--外部链接

第二周:Socket网络编程

-编译、构建和调试

--Video

--Video

--Video

-Socket接口

--Video

--Video

-UDP范例代码

--Video

-TCP范例代码

--Video

-本周作业

--外部链接

第三周:TCP协议与Linux内核

-TCP协议概述

--Video

--Video

-Linux网络协议栈源代码简介

--Video

-Linux系统的编译、构建和调试

--Video

--Video

-TCP协议源代码分析

--Video

-本周作业

--外部链接

第四周:IP协议及路由表

-IP协议基础

--Video

-路由表

--Video

-路由转发举例

--Video

-IP协议栈源代码解析

--Video

-路由协议简介

--Video

-网络层数据传输路径解析

--Video

-本周作业

--外部链接

第五周:ARP协议及ARP缓存

-ARP协议基础

--Video

-ARP解析的过程

--Video

-ARP解析在网络传输过程中的作用

--Video

-ARP协议栈源代码解析

--Video

-本周作业

--外部链接

第六周:二层交换网络及转发过滤数据库

-以太网基础

--Video

--Video

-交换机的学习、转发和过滤数据库

--Video

-常见二层协议

--Video

-数据链路层在Linux网络协议栈中的一些关键代码分析

--Video

-本周作业

--外部链接

第七周:DNS协议及域名存储与解析

-DNS协议基础

--Video

-DNS域名的存储

--Video

-DNS域名解析过程分析

--Video

-本周作业

--外部链接

第八周:互联网架构设计背后的渊源

-互联网架构设计的最初动机与核心目标

--Video

-互联网架构设计的具体目标及背后重要权衡

--Video

--Video

--Video

-课程考核

--外部链接

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。