从入门到精通:解锁Linux开发工具和编译器的力量

news/2024/7/21 5:51:14 标签: linux, excel, 运维

在这里插入图片描述

目录

  • 一.编辑器vim的使用
    • 1.vim的基本概念
    • 2.vim的使用
    • 二.编译器gcc/g++
      • 1.编译器的使用
      • 2.编译器是如何完成的?
      • 3.动态库与静态库

一.编辑器vim的使用

1.vim的基本概念

vim是一个方便编程的功能特别丰富的文本编辑器,凭借他简洁的三种模式以及丰富的快捷键操作,可使得熟练使用的人做到不使用鼠标完成代码的编写,所以深受人们喜爱。

2.vim的使用

vim是一个多模式的编辑器——命令行模式、插入模式、底行模式。三种模式的转换及关系如下:
在这里插入图片描述
下面在xshell下演示下,我们先创建个文件并用vim打开:
在这里插入图片描述

在这里插入图片描述
现在我们就进入了vim的命令模式,接着输入i就直接进入的插入模式,现在我们就能编写代码了。我们写入一段简单的代码进行功能演示:
在这里插入图片描述
接着我们输入Esc退出插入模式,进入命令模式在输入进入底行模式后输入wq将文件保存并且退出vim编辑器。
在这里插入图片描述
我们用cat显示出我们刚刚编写的代码内容:
在这里插入图片描述
显然我们成功向文件写入了一段代码并保存了下来。
在命令模式下还有诸多快捷的操作如下:

gg:将光标定位到开头
G:将光标定位到结尾
n+G:将光标定位到第n行
shift+$(4):将光标定位到当前行结尾
shift+~:将光标定位到行开头
(n)yy:可复制当前光标所在起n行
(n)dd:可删除当前光标所在起n行
(n)p:粘贴复制的内容(重复n次)到当前光标的下一行
u:可撤销上一步
ctrl+r:撤销之前的撤销
shirt+~: 大小写转换
(n)r: 对光标字符+之后的所有字符进行批量化替换
shirt+R : 换模式,对内容进行整体瑟换 --> 第四种模式
(n)x: 对光标字符之后的字符进行删除

在vim中我们想要进行多文件编辑时,可以在底行输入vs并命名即可。使用ctrl+ww可以切换到不同的窗口进行开发。
在这里插入图片描述

二.编译器gcc/g++

1.编译器的使用

我们可以使用编译器gcc/g++来编译上面编写的代码:
在这里插入图片描述
gcc和g++的区别即是gcc只可编译C语言无法编译c++而g++编译器都可以编译。在接下来的学习中可得知gcc无法编译c++是缺少关于c++的头文件、库文件所导致的。

2.编译器是如何完成的?

在之前的学习中,我们知道编译器在生成可执行程序前经历过以下几个阶段:预处理、编译、汇编、链接
我们可以使用选择不同的编译器选项,演示编译的不同阶段:
在这里插入图片描述
-E可以让编译器进行到预处理工作完成后停止对程序的翻译,这时候我们用vim观察.i文件的内容。
在这里插入图片描述
原本短短的几行代码,经过预处理竟然变成了近乎一千行的代码。我们知道预处理阶段会进行:去注释、头文件的展开、条件编译和宏替换,显然是头文件的展开造成了代码体积的增大
接着对预处理后的文件进行编译使得生成汇编文件,接着就能我们常在底层看到的汇编语言。
在这里插入图片描述

在这里插入图片描述
接着对编译后的文件进行汇编操作生成机器码(二进制码)。
在这里插入图片描述
我们用vim打开机器码也是无法识别的乱码。
在这里插入图片描述
接着进行链接生成可执行程序
在这里插入图片描述
到这里我们就不免想知道链接的过程是如何实现的呢?
链接的过程就是由库来提供方法头文件提供方法的声明+库文件提供方法的实现再加上你的代码即可实现一定的功能。

3.动态库与静态库

而库又分为动态库静态库。它们各有各自的特点:

动态库:
动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序可能导致很多程序都无法进行正常运行!
静态库:
在使用 静态库进行静态链接的时候,会将自己的方法拷贝到目标程序中,该程序以后不用再依赖静态库,直接只用程序中拷贝好的方法即可。

接下来在Linux下演示动态链接与静态链接的区别:

ldd作用:
用于打印程序或者库文件所依赖的共享库列表。

在这里插入图片描述

如上演示我们可得:
在Linux中,编译形成可执行程序,默认采用的就是动态链接-- 提供动态库
在Linux中,如果要按照静态链接的方式,进行形成可执行程序,需要添加-static选项 – 提供静态库还需注意的是gcc/g++默认优先动态链接,如果加上-static可以改变此次的优先级进行静态链接。但是linux默认只会安装动态库,在没有静态库的情况下是无法修改优先级的。

动态库与静态库的比较:
动态库因为是共享库,有效的节省资源(磁盘空间,内存空间,网络空间等)[优] 动态库一旦缺失,导致各个程序都无法运行[缺]
静态库,不依赖库,程序可以独立运行[优点],体积大,比较消耗资源[缺]


http://www.niftyadmin.cn/n/1008831.html

相关文章

JavaScript删除元素、移除、remove、removeChild、querySelector

文章目录 删除元素本身删除子元素删除父元素htmlJavaScriptremoveremoveChildquerySelector 删除元素本身 方法1.1 event.target.remove();方法1.2 event.target.parentNode.removeChild(event.target);方法2.1 idDeleteSelf.remove();方法2.2 idDeleteSelf.parentNode.re…

LwIP RAW API TCP服务端客户端编程及问题

TCP RAW API 1.1 新建TCP控制块 函数原型: struct tcp_pcb * tcp_new(void) 1.2 绑定控制块 tcp_bind() 用于服务端程序 将本地的 IP 地址、端口号与一个控制块进行绑定 函数原型: err_t tcp_bind(struct tcp_pcb *pcb, const p_addr_t *ipaddr, …

HTML5 游戏开发实战 | 俄罗斯方块

俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏看似简单但却变化无穷,游戏过程仅需要玩家将不断下落的各种形状的方块移动、翻转,如果某一行被方块充满了&…

【networkx全教程】python DAG有向无环图 包含 edge 边缘标注text教程

1 基础教程 常用网站: 官方文档Github (latest development)NetworkX官方介绍: 登录后复制 NetworkX (NX) is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks.<https://networkx.lanl.go…

Win 10 重装系统(PE方式)

前言&#xff1a; 最近这个笔记本&#xff08;ThinkPad E480&#xff0c;使用了四年左右&#xff09;用起来很卡&#xff0c;经常开机状态时&#xff0c;合上之后&#xff0c;再打开屏幕就卡死了&#xff0c;鼠标和键盘按了都没有反应&#xff0c;无奈之下只能强制按电源关机后…

IP编址数据转发

目录 一、IP编址 1.1、二进制、十进制和十六进制 1.2、进制之间的转换 1.3、IP编址 1.4、子网掩码 1.5、二进制和十进制转换 1.6、IP地址分类 1.7、IP地址类型 1.8、地址规划 二、VLSM与CIDR 2.1、有类IP编址的缺陷 2.2、变长子网掩码 VLSM 2.3、缺省情况下的掩码 …

CVPR 2023 | SAN: Side Adapter Network for Open-Vocabulary Semantic Segmentation

CVPR 2023 | SAN: Side Adapter Network for Open-Vocabulary Semantic Segmentation 论文&#xff1a;https://arxiv.org/abs/2302.12242代码&#xff1a;https://github.com/MendelXu/SAN 架构设计 冻结的 CLIP&#xff0c;其位置编码为了适应不同于预训练的输入分辨率&…