Linux系统编程 day02 vim、gcc、库的制作与使用

Linux系统编程 day02 vim、gcc、库的制作与使用

  • 01. vim
    • 0101. 命令模式下的操作
    • 0102. 切换到文本输入模式
    • 0103. 末行模式下的操作
    • 0104. vim的配置文件
  • 02. gcc
  • 03. 库的制作与使用
    • 0301. 静态库的制作与使用
    • 0302. 动态库(共享库)的制作与使用

01. vim

vim是一个编辑器,需要自行安装,可以使用命令sudo apt-get install vim。安装完之后可以在shell中输入vimtutor命令查看帮助文档。

vim有三种工作模式,分别是命令模式、文本输入模式以及末行模式。三者的切换关系如下:

在这里插入图片描述

0101. 命令模式下的操作

用户按下ESC键,就可以使vim进入命令模式。当用户使用vim打开一个新文件的时候也是默认进入的命令模式。命令模式中的操作如下。

快捷键操作
ZZ保存退出
gg=G格式化代码
h光标左移
j光标下移
k光标上移
l光标右移
w光标移动一个单词
gg光标移动到文件开头
G光标移动到文件末尾
0光标移动到行首
$光标移动到行尾
nG光标移动到第n行
x删除光标后一个字符,相当于Delete
X删除光标前一个字符,相当于Backspace
dw删除光标后一个字单词
d0删除光标前本行的所有内容,不包括光标所在字符
d$删除光标后本行的所有内容,包括光标所在字符
D删除光标后本行的所有内容,包括光标所在字符
dd删除光标所在行的内容,实际上是剪切
ndd删除光标当前行向下n行的内容,包括本行一共n行,实际上是剪切
v非列模式视图,使用hjkl进行移动选择内容,按d删除
ctrl + v列模式视图,使用hjkl移动选择内容,按d删除
u撤销
ctrl + r反撤销
yy复制当前行的内容
nyy复制当前行向下n行,包括本行一共n行
p在光标位置向下开辟一行并粘贴
P在光标位置向上开辟一行并粘贴
r替换当前字符
R替换当前行光标后的字符
//xxx 从光标所在位置开始搜索,按n向下搜索,按N向上搜索
??xxx 从光标所在位置开始搜索,按n向上搜索,按N向下搜索
#将光标移动到待搜索的字符串上,然后按n向上搜索,按N向下搜索
shift + k在带搜索的字符串上按下shift + k 或者 K 可以查看相关的帮助文档
ctrl + u向下翻半屏,光标向上移动
ctrl + d向下翻半屏,光标向下移动
ctrl + f向前翻一屏
ctrl + b向后翻一屏

0102. 切换到文本输入模式

从命令模式切换到文本输入模式的操作如下。

快捷键操作
i在光标前插入
a在光标后插入
I在光标所在行的行首插入
A在光标所在行的行尾插入
o在光标所在行的下面开辟一行,行首插入
O在光标所在行的上面开辟一行,行首插入
s删除光标后的字符并在光标当前位置插入
S删除光标所在当前行并在行首插入
列模式插入按I或者shift + i 向前插入,插入字符串后按两次ESC保存。

0103. 末行模式下的操作

从命名模式切换到末行模式,只需要输入:即可。下面是关于末行模式的一些操作。

快捷键操作
q退出
q!强制退出,不保存修改内容
w保存修改内容,不退出
wq保存并退出
x保存并退出
: s/old/new/光标所在行的第一个old替换为new
: s/old/new/g光标所在行的所有old替换为new
:m,ns/old/new/g将第m行到第n行的所有old替换为new
:%s/old/new/g将当前文件的所有old替换为new
:1,$s/old/new/g将当前文件的所有old替换为new
:%s/old/new/gc将当前文件的所有old替换为new,但是每次替换需要用户确认
!shell命令执行shell命令,按下两次ESC可以回到命令模式
sp当前文件水平分屏
vsp当前文件垂直分屏
sp 文件名当前文件和另一个文件水平分屏
vsp 文件名当前文件和另一个文件垂直分屏
ctrl + w + w多个窗口间切换光标
wall保存所有分屏窗口
wqall保存并退出所有分屏窗口
xall保存并退出所有分屏窗口
qall退出所有分屏窗口
qall!强制退出所有分屏窗口

分屏模式可以在shell中使用以下命令:

# 水平分屏
vim -on 文件1 文件2 ....
vim -o 文件1 文件2 ....
# 垂直分屏
vim -On 文件1 文件2 ....
vim -O 文件1 文件2 ....

0104. vim的配置文件

vim的配置文件分别是系统级别配置文件/etc/vim/vimrc和用户级别配置文件~/.vimrc。修改系统级别的配置文件会影响到该系统下的所有用户,如果修改的是用户级别的配置文件只会影响到当前的用户而不会影响到其它用户。在配置文件中,我们可以添加以下的设置。

命令功能
set nu设置显示行号
set nonu设置不显示行号
set shiftwidth = n设置gg=G缩进为n个空格,默认是8个空格
set autoindent设置自动换行,每行按与上一行同样的标准进行缩进
set list将制表符显示为^|,用$表示行尾
set showmatch在vim中输入相应的右括号时光标会暂时回到相匹配的左括号
set tabstop = n设置tab缩进的字符数目为n
set encoding=utf-8设置编码格式为utf-8
set smartindent为C程序提供自动缩进

这些命令也可以在末行模式下使用。

02. gcc

gcc编译器将C语言原程序文件生成一个可执行文件一共需要经理四个步骤,分别是预处理、编译、汇编、链接。

在这里插入图片描述

在这里插入图片描述
这四个步骤的命令如下:

# 预处理
gcc -E hello.c -o hello.i
# 编译
gcc -S hello.i -o hello.s
# 汇编
gcc -c hello.s -o hello.o
# 链接
gcc hello.o -o hello

当然我们可以一步到位:

gcc hello.c -o hello

接下来我们来看一看关于gcc的一些常用参数

参数功能作用
-v查看gcc版本号
–version查看gcc版本号
-E预处理,生成预处理文件
-S编译,生成汇编文件
-c只编译,生成.o文件,通常称为目标文件
-I指定头文件所在路径
-L指定库文件所在路径
-l指定库名称
-o指定生成的目标的名字
-g包含调试信息,使用gdb调试的时候需要添加-g参数
-On n=0~3编译优化,n的值越大优化得越多
-Wall提示更多警告信息
-D编译时定义宏

03. 库的制作与使用

库是二进制文件,是源代码文件的另一种表现形式,可以认为是加了密的源代码。库是一些功能相近或者相似的函数的集合体。库可以提高代码的重用性,提高程序的健壮性,同时也可以减少开发者的代码量,缩短开发周期。库可以分为静态库和动态库,动态库也被称为共享库。

0301. 静态库的制作与使用

静态库可以认为是一些目标代码的集合,是在可执行程序运行前就已经加入到执行代码中,称为可执行程序的一部分。静态库我们习惯于用.a作为后缀名,前缀为lib,库的名称是自定义的。比如有一个库的名称是test,则该静态库的库文件名就是libtest.a

静态库的制作主要分为两步,第一步是使用gcc中的-c参数将C语言源程序文件编译成.o文件。第二步是使用打包工具ar将.o问加你打包为.a文件。

例如此处我们有add.c、sub.c、mul.c、dive.c、main.c、head.h五个文件。其中head.h中为add.c、sub.c、mul.c、dive.c的声明部分,实现在各自的.c文件中。接下来我们需要将前面四个.c文件进行打包制作静态库,库名为smath。

首先将他们编译成.o文件。

# 第一种方法是全部直接编译
gcc -c add.c sub.c mul.c dive.c
# 第二种方法是逐个编译
gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
gcc -c mul.c -o mul.o
gcc -c dive.c -o dive.o

第二步使用ar打包工具进行打包为静态库文件。

# 将.o文件打包成静态库文件
ar rcs libsmath.a add.o sub.o mul.o dive.o

在打包命令中,参数r表示更新、c表示创建、s表示建立索引。

如此以来就创建好了一个静态库文件。那么怎么使用呢,我们可以通过gcc的参数去指定静态库文件以及头文件的所在路径即可。需要注意的是-l指定库名称的时候不需要写库的前缀lib以及后缀.a。如libsmath.a只需要写smath即可。另外-L-l-I参数后面跟的参数可以用空格隔开,也可以不隔开。如接下里我们需要编译main.c并执行。


# 生成可执行文件,指定头文件为当前路径,库文件为当前路径,库名为smath
gcc main.c -I./ -L./ -lsmath -o main

静态库文件制作好了之后,需要将.a文件和头文件一并发布给用户。静态库最终打包到应用程序中,实现函数本地化,寻址方便、速度快。程序在运行时与函数库再无任何关系,移植方便。但是静态库消耗系统资源较大,每一个进程使用静态库都需要复制一份,浪费内存。静态库会给程序的更新、部署和发布带来麻烦。如果静态库更新了,那么所有使用它的应用程序都需要重新编译、发布给用户。对于使用者来说,也就是一个很小的改动都需要重新下载整个程序。

0302. 动态库(共享库)的制作与使用

共享库的出现正好解决了上面动态库的不足。共享库在程序编译时并不会被连接到目标代码中,而是在程序运行的时候才会被载入。不同的应用程序如果调用相同的共享库,那么在内存中只需要有一份该共享库的拷贝即可,避免了内存空间浪费的问题。由于动态库是程序运行时才会被载入,也解决了静态库对程序的更新、部署和发布带来的麻烦。动态库习惯于以.so作为后缀名,前缀也需要加上lib。比如有个动态库的名字为dmath,则完成的动态库文件名为libdmath.so。

动态库的制作也有两个步骤,第一个步骤是使用gcc中的-fpic参数创建与地址无关的编译程序,生成目标文件.o。第二步是使用gcc的-shared生成动态库。

同样,我们以静态库的那个例子生成动态库,第一步生成目标文件的过程如下:

# 生成目标文件 -fpic 创建与地址无关的编译程序 -c 只编译
gcc -fpic -c add.c sub.c mul.c dive.c

第二步是生成动态库文件,这里取库名为dmath。

# 生成动态库文件 -shared 指定生成动态库
gcc -shared add.o sub.o mul.o dive.o -o libdmath.so

如此以来就生成了动态库文件libdmath.so。那么我们如何查看一个库中有哪些内容呢?我们可以使用nm命令。

# 查看dmath动态库中有哪些内容
nm libdmath.so
# 查看smath静态库中有哪些内容
nm libsmath.a
# 查看add.o中有哪些内容
nm add.o

动态库的使用和静态库的使用方法是一样的,需要指定头文件路径、库路径以及库名。如接下来编译main.c生成可执行文件如下:

gcc main.c -I./ -L./ -ldmath -o main

这样就可以生成可执行程序main。但是在执行运行main程序的时候会报错,这是为什么呢?因为系统加载可执行代码的时候,能够直到其以来的库文件名字,但是还需要知道所依赖的库的绝对路径,此时就会有系统动态载入器,也就是lld。执行ldd命令可以查看可执行文件依赖的库文件。如下面查看main所依赖的库文件。

# 查看main所依赖的库文件
ldd main

不过执行这句话的时候有时会反馈找不到。对于ELF格式的可执行程序,是由ld-linux.so*来完成的,它搜索ELF文件的DT_RPATH段,再搜索环境变量LD_LIBRARY_PATH,再搜索/etc/ld.so.cache文件列表,最后搜索/lib//usr/lib/目录找到库文件并将其载入内存。如果上面的都找不到就会报错。我们可以使用file命令查看文件的类型,如查看main的类型。

# 查看main的文件类型
file main

那么如何让系统找到自己的共享库呢?首先分析程序去搜索ELF文件的DT_RPATH段,这个部分是我们不能更改的,所以我们只能对剩下的三个路径进行下手。方法如下:

  • 第一种方法,拷贝自己制作的动态库放在/lib/或者/usr/lib/目录下。
  • 第二种方法, 临时设置LD_LIBRARY_PATH,在shell中执行export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
  • 第三种方法,永久设置LD_LIBRARY_PATH,将LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径设置到~/.bashrc中,然后再使环境变量生效,生效可以任使用以下的其中一个方法。
    • 执行. ~/.bashrc使配置文件生效
    • 执行source ~/.bashrc使配置文件生效
    • 退出当前终端,然后再次登录也可以使配置文件生效
  • 第四种方法,永久设置,把LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径设置到 /etc/profile文件中。
  • 第五种方法,添加到/etc/ld.so.cache文件中。编辑/etc/ld.so.conf文件,假如库文件所在的目录路径,再运行sudo ldconfig -v重建/etc/ld.so.cache文件。

通过上述的方法之后,再执行ldd main就可以找到对应依赖的库文件。也就是这个程序终于可以正常运行了。

动态库把对一些库函数的链接载入推迟到了程序运行的时期。动态库实现了进程之间的资源共享。动态库使程序升级变得简单。动态库使得链接载入完全由程序员在代码中控制。

最后对比以下动态库与静态库的优缺点。

-优点缺点
动态库1. 节省内存
2. 部署升级更新方便,只需替换动态库即可,然后再重启服务
1. 加载速度比静态库慢
2. 移植性差,需要把所有用到的动态库都移植
静态库1. 执行速度快,因为静态库已经编译到可执行文件内部
2. 移植方便,不依赖其它库文件
1. 耗费内存,因为每一个静态库可执行程序都会加载一次
2. 部署更新麻烦,因为静态库修改以后所有调用这个静态库的可执行文件都需要重新编译。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/199613.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARM AMBA AXI 入门 14 -- AXI-Lite 详细介绍】

请阅读【ARM AMBA AXI 总线 文章专栏导读】 文章目录 AXI LiteAXI-Full 介绍AXI Stream 介绍AXI Lite 介绍AXI Full 与 AIX Lite 差异总结AXI Lite AMBA AXI4 规范中包含三种不同的协议接口,分别是: AXI4-FullAXI4-LiteAXI4-Stream 上图中的 AXI FULL 和 AIX-Lite 我们都把…

Python大数据之linux学习总结——day11_ZooKeeper

ZooKeeper ZK概述 ZooKeeper概念: Zookeeper是一个分布式协调服务的开源框架。本质上是一个分布式的小文件存储系统 ZooKeeper作用: 主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper结构: 采用树形层次结构,ZooKeeper树中的每个节点被称为—Znode。且树…

GitLab的个人仓库转移到团队仓库

文章目录 一、Gitlab权限二、转移2.1、编辑个人仓库2.2、Transfer project2.3、切换Namespace2.4、确认修改 一、Gitlab权限 Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner Guest:可以创建issue、发表评论,不能读写…

服务器数据恢复—OCFS2下raid5磁盘损坏导致阵列崩溃的数据恢复案例

服务器数据恢复环境: IBM某型号存储,6块sas硬盘组建一组raid5,划分一个lun分配给Linux服务器并格式化为OCFS2文件系统,共享给虚拟化使用,存放的数据包括24台liunx和windows虚拟机、压缩包文件和配置文件。 服务器故障…

通过easyexcel实现数据导入功能

上一篇文章通过easyexcel导出数据到excel表格已经实现了简单的数据导出功能,这篇文章也介绍一下怎么通过easyexcel从excel表格中导入数据。 目录 一、前端代码 index.html index.js 二、后端代码 controller service SongServiceImpl 三、功能预览 四、后端…

[汇编实操]DOSBox工具安装——Ubuntu18.04系统

一、下载&安装 sudo apt install -y dosbox 二、启动 dosbox 三、C盘挂载 将上述文件下载放在任意路径,将DEBUG目录映射为虚拟C盘 MASM.EXE 是用来编译的,LINK.EXE 用来链接,这俩是必须的。 执行如下命令: mount c /m…

NSS [鹤城杯 2021]Middle magic

NSS [鹤城杯 2021]Middle magic 源码直接给了。 粗略一看&#xff0c;一共三个关卡 先看第一关&#xff1a; if(isset($_GET[aaa]) && strlen($_GET[aaa]) < 20){$aaa preg_replace(/^(.*)level(.*)$/, ${1}<!-- filtered -->${2}, $_GET[aaa]);if(preg_m…

java系列之 页面打印出 [object Object],[object Object]

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 &#x1f3f7;️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

【开源】基于JAVA的校园二手交易系统

项目编号&#xff1a; S 009 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S009&#xff0c;文末获取源码。} 项目编号&#xff1a;S009&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模…

目标检测标注工具AutoDistill

引言 在快速发展的机器学习领域&#xff0c;有一个方面一直保持不变&#xff1a;繁琐和耗时的数据标注任务。无论是用于图像分类、目标检测还是语义分割&#xff0c;长期以来人工标记的数据集一直是监督学习的基础。 然而&#xff0c;由于一个创新性的工具 AutoDistill&#x…

flink入门

1.安装flink&#xff0c;启动flink 文档地址&#xff1a;Apache Flink 1.3-SNAPSHOT 中文文档: Apache Flink 中文文档 代码&#xff1a;GitHub - apache/flink: Apache Flink 2. 打开端口 端口号&#xff0c; 启动jar ### 切换到flink 目录bin下 [rootlocalhost ~]# cd /…

CentOS7安装部署Kafka with KRaft

文章目录 CentOS7安装部署Kafka with KRaft一、前言1.简介2.架构3.环境 二、正文1.部署服务器2.基础环境1&#xff09;主机名2&#xff09;Hosts文件3&#xff09;关闭防火墙4&#xff09;JDK 安装部署 3.单机部署1&#xff09;下载软件包2&#xff09;修改配置文件3&#xff0…

开源更安全? yum源配置/rpm 什么是SSH?

文章目录 1.开放源码有利于系统安全2.yum源配置&#xff0c;这一篇就够了&#xff01;(包括本地&#xff0c;网络&#xff0c;本地共享yum源)3.rpm包是什么4.SSH是什么意思&#xff1f;有什么功能&#xff1f; 1.开放源码有利于系统安全 开放源码有利于系统安全 2.yum源配置…

在线客服系统源码 聊天记录实时保存 附带完整的搭建教程

在线客服系统是一个企业网站进行网络营销的最重要的工具。企业进行网络宣传后&#xff0c;会有很多访客进入到网站&#xff0c;这时候网站就需要有在线客服人员进行接待&#xff0c;及时的与访客进行沟通&#xff0c;才能留住访客&#xff0c;变流量为销量。 在线客服系统可以…

synchronized锁膨胀过程

轻量级锁&#xff1a; 使用场景&#xff1a;如果一个对象虽然有多线程要加锁&#xff0c;但加锁的时间是错开的&#xff08;也就是没有竞争&#xff09;&#xff0c;那么可以 使用轻量级锁来优化。 轻量级锁原理 1.创建锁记录&#xff08;Lock Record&#xff09;对象&#…

十一、统一网关GateWay(搭建网关、过滤器、跨越解决)

目录 一、网关技术的实现 在SpringCloud中网关的实现包括两种: 作用&#xff1a; 二、搭建网关服务 1、新建模块&#xff0c;并添加依赖 2、新建Gateway包&#xff0c;并编写启动类 3、编写yml文件 4、启动服务&#xff0c;并在网页内测试 5、步骤 三、路由断言工厂 …

解决龙芯loongarch64服务器编译安装Python后yum命令无法使用的问题“no module named ‘dnf‘”

引言 在使用Linux系统时,我们经常会使用yum来管理软件包。然而,有时候我们可能会遇到yum不可用的情况,其中一个原因就是Python的问题。本文将介绍Python对yum可用性的影响,并提供解决方案。 问题引发 正常情况下,安装linux系统后,yum命令是可用状态,升级Python版本后,…

【AI】行业消息精选和分析(11月21日 星期二)

技术发展 &#x1f525; OpenAI 员工集体签署信件&#xff1a; - 员工要求董事会辞职并重新任命首席执行官奥特曼。 - 否则可能集体加入微软。 昨天就玩我们领导发言&#xff0c;后面大家接龙收到的那一套了。 &#x1f632; 奥特曼加入微软引发猜测&#xff1a; - 对于一个公…

抖音电商双11官方数据最全汇总!

11月13日&#xff0c;抖音电商数据发布“抖音商城双11好物节”数据报告&#xff0c;展现双11期间平台全域经营情况及大众消费趋势。 报告显示&#xff0c;10月20日至11月11日&#xff0c;抖音电商里的直播间累计直播时长达到5827万小时&#xff0c;挂购物车的短视频播放了1697亿…

FTX的前世今生:崛起、辉煌与崩塌

FTX&#xff0c;一度被誉为加密货币领域的明星交易所&#xff0c;其快速的崛起和令人瞩目的崩塌吸引了全球的关注。让我们回顾一下FTX的前世今生&#xff0c;了解其短暂的辉煌和骤然的崩塌。 1. 崛起&#xff1a; FTX的创始人山姆班克曼-弗里德在加密货币领域具有深厚的背景和…