当前课程知识点:互联网体系结构 > 第二周:Socket网络编程 > 编译、构建和调试 > Video
编程需要用的工具,包括编译、构建和调试
实际上主要涉及到三个工具
那就是gcc
是用来编译的
还有用来构建命令make,还有一个就是gdb
我们先看gcc
在默认情况下ubuntu并没有提供这个gcc编译器
因为是一个linux桌面发行版
主要是个图形化界面的东西
给普通用户使用的
它就是
如果程序员要用他的话
还需要再安装一个编译的工具
这地方
他已经做了一个打包好的build-essential
我们通过这么一个命令
就可以把这个工具安装好
熟悉的就是c程序
他的一个编译
当然其他的编程语言类似了是吧
类似
但对于编译型的语言基本上都这样
我们从源代码然后
把它编译成汇编代码
然后呢
又通过汇编器
就是我们在这边来预处理的
我待会用命令演示一下而已
然后那边变成编译成目标文件
这个目标文件就和当前的CPU
我们之前讲过abi
就是CPU的指令集这地方
那就是二进制的CPU的指令集
.asm的就是当前CPU所支持的这个汇编代码
然后呢
我们通过连接器把它连接成一个可执行文件
们当启动这个可执行文件执行的时候
就是加载到内存里面的执行
整个一个从c代码额变成一个可执行的运行的程序是吧
当前正在运行的程序
他大概经历这么一个阶段
但是呢
我们正常情况都是gcc
他是一个前端程序
它后背后有就是汇编器,有预处理,有链接器
如果我们只需要掌握gcc这么一个命令及其他的参数
我们就可以把程序的编译就可以搞起了
但是
就是因为就是如果仅仅使用gcc的了
当这个源代码比较多的时候
我们的项目我们的项目可能就是刚开始
我们写一个很简单的程序
比如说HelloWorld
那么就这个用gcc编译还比较简单
如果我们的项目有几百个
甚至上千个文件的时候
那么我们想要就是通过gcc这个命令来编译的话
可能就比较困难了的话就比较复杂了
我们就需要用构建工具
也就是工程文件来帮我们组织好
这个项目先编哪些源代码
再边哪些最后怎么链接是吧
就是帮我们很好的组织起来
那我们先来看gcc的使用
对吧gcc的用法
我们这地方可以写一个简单的程序
我们把这几个参考命令
我们一个一个的来
这时候
我们用gcc就可以编译的
helloworld
这时候编译出来的是
a.out
我们也可以指明一个程序名
我们先看
他的输出
这个gcc呢
但我们就是这么来
编译就是gcc背后帮我们把所有的编译
汇编链接预处理等等
所有的工作都给屏蔽掉了
但是我们一个开发人员
应该对编译背后的工作有一个了解
对吧就是有一个了解
我们通过就是gcc提供的参数命令的方式
我们来分解它
这个编译过程,分解这个编译过程
我们先来看一下
首先我们看第一个有一个E
E的参数对吧这个呢
还是就是一个预处理
我们先看看效果哈gcc
-E
我们这说指名-o就指明他的
我们这叫hello.c
通过E参数就是生成一个.cpp,有一个预处理
cpp预处理吧
cpp预处理了
这时候我们打开这个cpp
我们可以看到
我们可以看到这个程序
前面加了很多东西对吧
我如果看到最后的
我发现最后才是
我们写的代码
而前面的那个include stdio就是通过预处理之后他都把它包含进来了
include进来
所以这时候是把一些那个libc的函数原型等等都include进来
这样呢
就是包括宏替换等等
也都会在这个阶段完成
就是预处理阶段
预处理阶段预处理完之后呢
我们还可以将预处理的文件,通过就是-x指明
他是我通过预处理文件通过-S指明我是要
把它编译成汇编代码
我们可以使用这么一个命令啊
但是我们也可以直接用
-S输出成汇编
我们一来这两个命令
我们都是要试一下
我们先来就是
output
-S是指输出成汇编 hello.s
然后呢
hello.cpp
这样那我们就可以编译出来一个
少一个-o
你就说
我们这地方输出的目标是hello.s
这样我们输出来
我们可以看一下这个我们输出来的hello.s
里面呢
再说一个就是汇编代码了
movq是64位的汇编
就是因为我们当前的CPU是64位的x86的64位
恩
所以这边movq他的寄存器也是
rsp对吧
等等
以r开头的
这是
我们也可以看到就是我们这边call put
也就是依赖的一个就是
函数,printf
我们把这个文件就是编译成汇编了
但是我们还可以通过简单的方式把它编译成就是直接-S -o
hello
这地方为了区分
我就hello.s1
为了做区分
我们可以直接从hello.c
编译
我可以看一看hello.s1
他编译出来的
效果是一样的吧
那接着呢
这是就是汇编的
就是我们讲这就是通过gcc来编译
我们还可以把就是汇编码呢
通过asm来编译成.o对吧
那我们可以看一下这边的命令参考
我们通过-X assembler 汇编器
通过汇编器
但是我们也可以用as
实际上
它内部gcc也是一个前端的工具程序,先让他背后调用了as帮我们画这个点S文件也是汇编码
输出成.o目标代码
这时候就是把汇编代码编译成二进制的
也就是机器代码了
对吧
我们可以试一下这句命令
一个是
.c文件
这是直接输出的
这个算是我们最常用的是吧
这个是我们最常用的
这时候我们输出的效果是一样的
是的
我们as命令一样
我们是通过输出.o
但是我们那就是
然后
我们通过as就是把汇编代码汇编成
目标代码是吧
这两个命令也可以
这时候我们生成了
就我们就生成了这个
生成的目标代码之后的目标代码呢
我们可以把它链接成可执行文件
对吧链接成可执行文件
我们也是通过两种方法
一种是我们最常用的-o hello对吧
然后hello.c对吧
这样的我们可以把它连接成
但是我们也可以用ld命令会比较复杂一点
因为你要指明就是当前系统的libc的库在哪里
所以那个命令会用起来会比较复杂的
我们还是通过gcc的方式来使用
但是我们也可以用
然后呢
我们是将.o文件链接成可执行文件
但是这两个链接出来的效果是一样
结果是一样的
都是
我们这样呢
我们就对这个
恩我们就对这个从C代码编译成可执行文件
并且能把它执行起来这么一个过程
有一个简单的理解
有简单的理解
-课程内容简介
--Video
-网络协议基础
--Video
--Video
--Video
--Video
-上网浏览网页背后的网络通信过程
--Video
--Video
-实验环境安装配置
--Video
-网络相关命令
--Video
--Video
-本周作业
--外部链接
-编译、构建和调试
--Video
--Video
--Video
-Socket接口
--Video
--Video
-UDP范例代码
--Video
-TCP范例代码
--Video
-本周作业
--外部链接
-TCP协议概述
--Video
--Video
-Linux网络协议栈源代码简介
--Video
-Linux系统的编译、构建和调试
--Video
--Video
-TCP协议源代码分析
--Video
-本周作业
--外部链接
-IP协议基础
--Video
-路由表
--Video
-路由转发举例
--Video
-IP协议栈源代码解析
--Video
-路由协议简介
--Video
-网络层数据传输路径解析
--Video
-本周作业
--外部链接
-ARP协议基础
--Video
-ARP解析的过程
--Video
-ARP解析在网络传输过程中的作用
--Video
-ARP协议栈源代码解析
--Video
-本周作业
--外部链接
-以太网基础
--Video
--Video
-交换机的学习、转发和过滤数据库
--Video
-常见二层协议
--Video
-数据链路层在Linux网络协议栈中的一些关键代码分析
--Video
-本周作业
--外部链接
-DNS协议基础
--Video
-DNS域名的存储
--Video
-DNS域名解析过程分析
--Video
-本周作业
--外部链接
-互联网架构设计的最初动机与核心目标
--Video
-互联网架构设计的具体目标及背后重要权衡
--Video
--Video
--Video
-课程考核
--外部链接