
◆博主名称:少司府
欢迎来到少司府的博客☆*: .。. o(≧▽≦)o .。.:*☆
⭐Linux个人专栏:Linux系统编程
⭐琢玉成器终有时,笔底生花夺锦归
目录
1. 软件包管理器
Linux中安装软件的方式:
1)、源码安装
2)、软件包安装 --- rpm
3)、包管理器 yum(centos) apt/apt-get(ubuntu)
相关知识:软件程序之间是存在依赖的,他可能需要多个第三方的库,单独下软件的话可能不能运行。(例如,ls命令需要C语言的库)
如果使用软件包安装,那么可能出现依赖缺失问题、版本兼容性问题。
因此,我们推荐使用包管理器安装(源码安装很复杂)。
并且,安装的本质就是拷贝,在Linux下安装软件,必须使用root,安装在系统之后所有人都能使用。
因此,我们安装软件,要把其相关的依赖一起安装,包管理器会自动解决依赖问题。
1.1 什么是包管理器?
包管理器类似于手机上的应用商店,用于下载软件(可以解决依赖问题)。

那么,Linux上的软件,谁提供的呢?
1.2 Linux软件的生态
Linux下载软件的过程:

操作系统好坏的评估--生态问题:

为什么有人免费维护特定社区,提供第三方开源库?

本质上开源就是一种商业模式,有人用该社区的库,那么就不希望该社区倒了,会自己募捐。
软件依赖问题:

国内镜像:

有很多社区、第三方库是外网的,不方便下载,国内就有大佬做镜像的工作,把这些东西放到国内的网站上。
由此,我们可以利用apt下载一个好玩的软件:
apt -y install sl
运行结果如图:

1.3 yum/apt具体操作
1)、查找所有包含sl名字的软件:
apt list | grep sl
2)、强制卸载sl软件:
apt remove -y sl
3)、安装sl软件:
apt install -y sl
安装lrzsz软件:
apt install -y lrzsz #lrzsz用于Linux与Windows互传文件
注意:关于apt、yum的所有操作必须保证网络通畅,可以用ping命令来检测:
ping www.baidu.com
1.4 安装源
如果是虚拟机,需要关注,如果是云服务器,则不需要关注,Ubuntu安装源路径:
$ cat /etc/apt/sources.list # 标准源
$ ll /etc/apt/sources.list.d/ # 扩展源
# ubuntu 安装扩展源,就结合未来具体场景
替换安装源,解决外网问题。
2. Vim编辑器
打开vim:
vim
关闭vim:
:q #或者快速按两下大写的Z
写入文本并保存退出:
:wq #w就是保存的意思
2.1 vim的模式
vim本质上是一款多模式的编辑器,其中最常见的是:命令模式(默认)、插入模式、底行模式。
命令模式下不允许写东西,需要在插入模式进行。我们可以输入 i 来进入插入模式:
vim test.c

如图,INSTER表示现在是插入模式。
插入模式不能直接退出,要先回退到命令模式,按一下键盘左上角ESC进入命令模式,在命令模式下可以用两次大写Z来退出,我们进入底行模式,:(英文的冒号),此时可以输入q、wq等。

我们可以在底行模式下用 set nu 来标记行号:

用ESC回退到命令模式。
2.2 vim的命令模式的命令集
在命令模式下:
1)、移动相关:
gg:光标快速回到最开始
G:光标回到最后
n + G:光标回到第n行,例如:8 G
¥(shift + 键盘上面的4):光标到该行结尾
……(shitf + 键盘上面的6):光标到该行最开始
h:左
j:下
k:上
l:右
当然,目前vim也支持上下左右的键,但是使用最多是hjkl这四个。
w:以单词为单位向后移动(默认是一个单词,可以带数字)
b:以单词为单位向前移动(默认是一个单词,可以带数字)
2)、编辑相关:
yy:复制当前行(前面可以加数字n,表示从光标行开始,复制后n行)
p:光标所在位置进行粘贴(前面可以加数字n,表示粘贴n次复制的内容)
u:撤销
ctrl + r:撤销u操作
注意:一旦退出文件编辑,就无法进行撤销了;但是只是q保存,没有退出,可以撤销。
dd:剪切(可以加数字n,表示从光标行开始,剪切后n行),也可以用于删除
x:删除光标所在位置的字符(可以加数字n,向后删n个)
X:删除光标左侧字符(可以加数字)
r:替换光标所在字符,先输入r,在输入目标字符(可加数字n,表示替换为n个目标字符)
R:批量化替换,进入replace模式(替换模式),以行为单位,不断替换光标所在字符,esc返回命令模式
~:大小写切换(shift + `)
ctrl + v:进入视图模式,该模式下可以用hjkl进行区域的选择,然后用 I (shift + i),直接切换到插入模式,进行操作(输入 // 进行注释),再esc回退,就可以批量注释了。
进入视图模式之后,可以用命令模式的命令,进行批量化注释、批量化删除、批量化补充
#(shift + 3):选中光标所在位置的单词
n:进行逆向查找(和#混合使用)
进入插入模式的三个指令——
i:直接进入插入模式;a:光标向后移动一个字符并进入插入模式;o:新起一行并进入插入模式
2.3 vim的底行模式的命令集
前面说了,:(冒号)表示进入底行模式
w:保存,q:退出
q!:强制退出
wq!:强制保存并退出
set nu:设置行号
set nonu:取消行号
!:有两个意思,一个是表示强制;另一个!+ Linux系统的命令则可以直接操作系统,不用退出文件编辑


如图,按任意键继续(回到命令模式)
%s/原目标字符/替换的字符/ :底行模式的批量化替换
vim + 文件名(vim编辑器外面):有两个含义——若存在该文件,表示用vim编辑器进入该文件;若不存在,也可以进入,用wq保存退出之后会自动生成该文件。
vs + 文件名:表示分屏

如图,该命令和上一条一样,也可以创造文件。另一个要注意的是,光标在哪个文件下,表示操作哪个文件,模式也是其对应的模式。分屏可以分多个。
ctrl + ww:表示在分屏下,光标切换到另一个文件
2.4 使用vim的技巧
vim 文件名 +n:表示打开文件时光标自动定位到第n行,例如vim code.c +14
!v:表示自动执行最近匹配的以v开头的命令
user1@iZn4adydu3h6t497949n3dZ:~/lesson5$ !v
vim code.c
3. Vim编辑器的配置
3.1 手动配置
在家目录下查看文件.vimrc,如果没有,则创建
![]()
再用 vim .vimrc 进入该配置文件,输入要配置的信息。例如:set nu
当再进入vim编辑器的时候,配置信息立刻生效,如果不想要配置信息,可以用双引号注释掉

因此,vim配置其实就是修改vimrc文件。
我们也可以在 /etc/vimrc 下配置,但是这个是全局的配置文件,会对所有账号生效,推荐只配置自己的。
set nu " 设置行号 "
syntax on " 设置语法高亮 "
set tabstop=4 " 设置tab缩进长度为4空格 "
set autoindent " 设置自动缩进 "
set cindent " 针对C语言的缩进功能 "
如图是我们自己配置的vim文件。
3.2 网络下载
除了自己手动配置外,可以在gitee上查找别人的一键式配置链接,在家目录下输入。(注意,一定要在普通用户下用,防止root用户下出问题)
4. gcc和g++

如图,gcc 文件名 进行编译,默认生成 a.out 的可执行程序,再 ./a.out 运行该程序。
4.1 程序的翻译过程
gcc code.c -o mycode #生成可执行程序mycode
gcc -o mycode.exe code.c #也可以这样写,注意-o后面跟生成的文件
4.1.1 预处理(进行宏替换)
1)、进行宏替换
2)、去除注释
3)、头文件展开
4)、进行条件编译
如图是code.c文件:

![]()
如图,-E表示开始进行程序翻译,在预处理完成的时候就停下来,.i表示临时文件。
其中,code.i 仍然是c语言文件。
4.1.2 编译(生成汇编)
gcc -S code.i -o code.s
生成汇编文件,.s为汇编文件的后缀。
-S表示从现在开始进行程序的翻译,编译做完了就停下来。
为什么C/C++编译,要先变成汇编?
早期计算机编程是二进制编程,但这个不方便,后来有了汇编语言,也因此编译器产生了。基于汇编语言,出现了许多编译型语言,例如C/C++。
汇编语言已经发展许久了,我们站在巨人的肩膀上,先把C/C++编译成汇编,再将汇编翻译成二进制(这个步骤大佬已经做过了,只需要翻译成汇编这一步骤),这样做更简单。
4.1.3 汇编(生成机器可识别代码)
gcc -c code.s -o code.o
-c 表示开始进行翻译,当汇编完成就停下来。
code.o 叫做可重定位目标文件,在Windows、vs2022中,就是xxx.obj文件,本身已经是二进制的了,但是无法直接执行。
code.o 仅仅把自己的源文件编译了,但自己的源文件还包含了很多库方法,没有和库进行链接,因此无法直接执行。
4.1.4 链接(链接库文件,生成可执行程序)
gcc code.o -o code
小tips:在编译的时候,往往先生成.o文件,再用gcc进行链接。
gcc -c code.c #生成同名的.o文件,即code.o
ldd 可执行程序文件名:可以查看链接了哪些库。

libc.so.6 就是c语言的库。
1)、动态库:Linux(.so)windows(.dll)
2)、静态库:Linux(.a)windows(.lib)
什么叫动态库?什么叫静态库?如何理解?
4.2 条件编译
4.2.1 Linux中的条件编译
我们写一个具有条件编译的程序:
#include <stdio.h>
#define M
int main()
{
#ifndef M
printf("社区版/免费版 version\n");
#else
printf("专业版/收费版 version\n");
#endif
}
再进行编译运行可得到结果:
gcc code.c -o code
./code

当我们注释掉M的定义之后,也可以在Linux中用命令行的方式来宏定义M:
// #define M
gcc code.c -o code -DM
D表示命令行级别的宏定义,M表示定义的宏变量就是M,不赋予初始值就是1
我们也可以赋给M初始值:
gcc code.c -o code -DM=100 #宏定义M为100
4.2.2 条件编译的用途
1)、软件对于专业度、收费情况进行业务区分,使用条件编译,可以进行代码动态裁剪
例如:vs2022社区版(免费版)/ 专业版(企业版)
2)、内核源代码也是采用条件编译进行代码裁剪
3)、开发工具、应用软件对于多平台的适配(例如:同一软件可以在Windows、Linux两个平台上跑)
4.2.3 编译器的产生
在4.1.2中,我们讲过C/C++为什么要先生成汇编,这类编译型语言就需要编译器来把它生成汇编语言,具体过程如下:
第一版编译器是二进制写的,用于将汇编语言编程二进制版,第二版编译器是汇编语言写的,将这个编译器用第一版编译器编译一下,之后第一版就不要了,诞生了第一个用汇编语言写的汇编编译器。
之后,用这个汇编语言写的编译器来编译汇编语言。
这个就是编译器的自举过程。
C/C++的编译器同理,它们是C/C++写的,通过编译器自举来生成第二版编译器编译对应语言。
4.3 动静态库
库是一套方法或者数据集,为我们开发提供最基本的保证(基本接口,功能,加速我们二次开发)
例如:
C语言标准库:libc.so.版本号
C语言静态库:libc.a.版本号
在Linux中,去掉前缀lib,去掉 . 后面的后缀,剩下的才是这个库的真实名字。上面C语言库的真实名字就是c
例如:xyz库就是 libxyz.so 或者 libxyz.a
4.3.1 什么叫做动态库?
动态库以.so结尾,其内部会自己实现方法,我们自己的程序(例如:code.c)会使用库中的方法(例如:printf),将自己的程序和动态库链接起来就能在库中找到方法,由此生成可执行程序。
动态库典型的特点:
1)、在执行目标方法的时候,需要跳转到库中执行,完成之后再返回。
2)、动态库也叫做共享库,其被多个程序共享,一旦缺失,会导致所有程序无法执行!
所谓的链接也就是让我们的程序能找到库中方法的地址,例如:printf -> libc.so:0x1234
这就是动态链接。
4.3.2 什么叫静态库?
那么,什么叫静态链接呢?
静态链接就是将方法在对应位置拷贝到我们的程序中,之后执行就直接在我们的程序中执行。
静态库只有在链接时有用,一旦形成可执行程序,静态库就可以不再需要。
4.3.3 动静态库对比
1)、动态库形成的可执行程序体积一定很小
2)、可执行程序对静态库的依赖小,但动态库不能缺失
3)、程序运行,需要加载到内存,静态链接的,会在内存中出现大量重复的代码
4)、动态链接保存的只是方法的地址,比较节省资源
4.3.4 验证

如图,gcc编译C语言默认使用的是动态链接。
我们可以要求gcc使用静态编译:
gcc code.c -o code -static
下载一下C语言静态库(我的系统是阿里云的Ubuntu 22.04.5 LTS):
apt install -y build-essential libc6-dev
检测一下是否有libc.a:

静态链接的方式编译code.c:

如图,代码体积太大了。
4.4 周边问题
1)、验证C++的编译:

C++和C基本上是一样的,我们可以看一下C++的库:

如图,libstdc++.so.6 就是C++的标准库。
我们可以用 file 命令来查看C/C++程序的链接方式:

如图,默认的也是动态链接。
我们依旧可以用 -static 来进行静态链接:

2)、关于动态库


动态库本质:让我们程序中公共的代码保证在内存中只出现一份。
这个时候动态库也更应该叫做共享库。
3)、Linux系统中相当多的指令依赖C动态库
4)、普通用户的sudo
在普通用户下,我们可能无法执行sudo命令:

这时候,我们需要切换到root用户,并进入sudoers文件里面进行修改:

如图,在Allow那一行下面加上红框框里面的内容,这样user1就能使用sudo命令了。

5)、库的本质
我们在分工写程序时,不愿意将自己的 .c/.cpp 源文件直接给他人,那么我们可以先将其编译成.o文件,再交给别人链接。
例如:code.h 中声明了方法,code.c中实现了方法,main.c是主程序。
我们不愿意直接给出code.c,那么可以:
gcc -c code.c
生成同名.o文件,这样他人就可以用我们实现的方法而不暴露我们的源代码了。
因此,库的本质就是被打包起来的 .o 文件。例如:.so文件
本期的分享就到这里,如果觉得博主的文章比较对胃口的话,可以点一个小小的关注~
您的三连是我持续更新的动力~
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/CAO_070413/article/details/166140210




