Linux修炼:开发工具

Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!

我的博客: <但凡.

我的专栏: 《编程之路》《数据结构与算法之美》《题海拾贝》《C++修炼之路》《Linux修炼:终端之内 洞悉真理》

欢迎点赞,关注!

目录

1、Linux系统下软件的安装、

2、软件安装

3、文本编辑器vim

3.1、vim的使用

3.1.1、命令模式

3.1.2、底行模式

3.1.3、块视图和替换模式

3.2、vim的配置

4、gcc/g++

4.1、预处理

4.2、编译

4.3、汇编

4.4、链接

5、Linux生态


1、Linux系统下软件的安装、

软件安装有以下几种方式

(1)源码安装

(2)rpm安装方式

把源代码编译好打包下载。但是软件之间存在依赖关系,如果没有安装他所需要的前置软件,所以有时候下载下来这个东西,也是用不了。

我们不使用以上两种方式进行安装,因为很麻烦。

(3)yum/apt 工具级安装

这种安装方式就很方便了,他会自动解决依赖关系,方便到就和我们从手机应用市场,直接下载app一样简单。

我们下载的软件被放在远端的软件包服务器 ,下载的时候,我们的服务器对远端服务器进行请求,然后再进行下载,返回服务器。Linux系统中内置了软件包服务器地址,所以说可以找到远端服务器。

当然,如果我们用的是云服务器的话,系统里面的链接并不是原来的链接了,因为原来的链接对应的软件包服务器都在国外,在国内无法访问(或者用魔法)。那么国内就有厂商和高校,组织把国外的服务器中的内容镜像过来,并且把内置的服务器地址改成国内的服务器地址,这样我们就可以直接下载了。但是如果你使用的是虚拟机,那么下载软件还是有些麻烦的,因为我们得更新镜像源。

我们可以去**/etc/yum.repos.d/**中的特定文件中(我的是CentOS-Base.repo)查看当前服务器的软件包服务器链接:

2、软件安装

我们可以直接使用yum/apt进行安装:

yum/apt install -y 软件

如果去掉-y ,每次安装他都会询问是否确定安装。

卸载软件:

yum/apt remove 软件

我们还可以搜索软件:

yum/apt list | grep 软件名

或者:

yum/apt search | grep 软件名

我们可以使用ai生成一些好玩的命令或者软件,安装到我们的系统上。

软件包服务器进一步划分,划分出了稳定软件源和扩展软件源。某些较新的软件都是属于扩展软件源的。所以说如果再安装软件是安装失败,我们可以尝试使用下面这个指令更新软件源:

yum install -y epel-release

3、文本编辑器vim

现在我们下载一些工具,能让我们在linux系统上写代码。

我们先来介绍一些vim的基础操作。

3.1、vim的使用

在下载vim之后,我们可以通过 vim+文件名 来打开文件。默认模式是命令模式,我们写不了东西。这时候我们按i,可以切换到插入模式。这时候我们就可以在里面写一些代码了。当然了不配置的vim很难用(配置了也不咋好用),后面我会介绍一些简单的配置。

vim常用的有五种模式,我们可以使用按键进行五种模式的切换。

我们分别来看一下这五种模式。

3.1.1、命令模式

在打开文件的时候,我们可以使用vim 文件名 + 数字 ,让光标默认就呆在第几行。命令模式中,键盘的输入都被当做命令来看待。

命令模式中,我们可以使用yy,快速复制当前行,并使用p粘贴出来。我们可以使用数字+p,一次性复制n行。

我们可以使用gg,直接把光标定位在最开始,数字+shift g可以定位到指定行。 使用shift+4($) 快速定位到行尾,shift+6(^) 快速定位到行首。也可以使用 h j k l上下左右四个方向移动光标。

操作很多不一一说了。给大家罗列一下常用的操作:

h:向左移动一个字符

j:向下移动一行

k:向上移动一行

l:向右移动一个字符

w:移动到下一个单词的开头(很常用)

b:移动到上一个单词的开头

^:移动到行首

$:移动到行尾

gg:移动到文件的第一行

G:移动到文件的最后一行

i:在当前光标位置进入插入模式

a:在当前光标后进入插入模式

o:在当前行下方插入新行并进入插入模式

O:在当前行上方插入新行并进入插入模式

x:删除光标处的字符

X: 向前删除光标处的字符

dd:删除当前行

yy:复制当前行

p:粘贴复制或删除的内容

u:撤销上一次操作

Ctrl + r:重做上一次撤销的操作

yaw:复制单词(包括空格)

yiw:复制单词(不包括空格)

shift+#:选中一个单词(高亮)

n:查找下一个

这里面大部分的命令都可以和数字搭配,实现多次操作。

3.1.2、底行模式

接下来介绍一下底行模式的操作:

w:保存文件

q:退出Vim

q!:强制退出,不保存更改

w!: 强制保存

wq!:强制保存并退出

wq:保存并退出

w filename:另存为指定的文件名

%s/文本1/文本2/ 将文本1替换为文本2

sp 加文件名水平分屏打开文件

vsp 加文件名垂直分屏打开文件

q 关闭当前窗口

only 关闭其他窗口

set nu 显示行号

set nonu 隐藏行号

!+shell命令 执行外部命令(如:!ls

r+文件名 插入文件内容到当前光标

在分屏模式下,我们可以使用ctrl+ww来实现窗口间的切换。

3.1.3、块视图和替换模式

这两个模式没啥好说的,简单说一下。

shift+r可以进入替换模式,替换模式下,所输入的字符都会覆盖原字符。

ctrl+v进入块视图模式,在块视图模式中,我们可以实现选择某一个区域,进而实现批量化注释操作。块视图模式中,hjkl进行上下左右移动,再输入I,接着双斜杠//,再按ESC,实现批量化注释。

类似的,我们也可以**使用块视图模式批量化插入文本内容。**因为上面批量化注释的实质其实就是批量化插入两个双斜杠。

其实vim不止这五种模式,现在vim的模式是有十二种的,但其实以上五种就已经够用了。

3.2、vim的配置

大家可以拿原生vim试一下,很难用,因为他没有对齐,自动补齐,之类的操作。所以我们得把vim配置一下让他更好用。vim的配置我们要使用普通用户来配置。以下是几个配置vim的命令:

基本配置(显示行号):

bash 复制代码
set number
set relativenumber

语法高亮,自动缩进:

bash 复制代码
syntax enable
filetype plugin indent on

代码补齐:

bash 复制代码
let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py'
let g:

设置Tab键行为和缩进:

cpp 复制代码
set tabstop=4
set shiftwidth=4
set expandtab
set autoindent

优化搜索:

bash 复制代码
set ignorecase
set smartcase
set hlsearch

那么这些指令怎么用呢?我们要在家目录中,当前账号的文件下(比如/home/用户名),新建一个.vimrc文件。启动vim时,系统会自动在家目录中找到这个.vimrc文件,并且载入这个配置文件中的内容,给我们呈现配置的效果。

这个配置各个账号的配置效果都是独立的,使用此账号配置后,其他账号使用的vim仍然是没有配置过的vim。

4、gcc/g++

我们下载gcc/g++之后,就可以用他们来编译我们的代码了。gcc只能用来编译C语言,g++C语言,C++都可以编译。

接下来我们看一下怎么编译运行我们的代码:

首先我们在code.c文件中写这样一串简单代码:

接着执行以下指令:

我们会发现在当前目录,生成一个a.out文件:

这是一个可执行文件,我们可以直接运行他:

运行结果就打印在了我们的终端上。

但是呢,我们一般不这样使用。我们一般执行以下命令,生成指定名字的可执行程序:

bash 复制代码
gcc 源文件 -o 可执行程序文件名
//或者
gcc -o 可执行程序文件名 源文件1 源文件2

大家都知道,**源代码变成可执行程序,是需要经过一下四个阶段,分别是预处理,编译,汇编,链接。**那么接下来我们就分别介绍一下gcc是怎么一步步把源代码变成可执行程序的。

4.1、预处理

预处理会做一下几件事:

1)宏替换

(2)去注释

(3)头文件展开

(4)条件编译

**宏替换,去注释就不说了,头文件展开就是在预处理的时候直接把头文件的内容拷贝到源文件中。条件编译,就是使用宏的方式,对代码进行一些裁剪。**比如以下就是一个条件编译的例子:

cpp 复制代码
#ifdef DEBUG
    printf("Debug mode");
#else
    printf("Release mode");
#endif

如果我们定义了名为DEBUG的宏,那么在预处理阶段就会裁剪为printf("Debug mode");这串代码,如果没有定义这个宏,这串代码就会裁剪为printf("Release mode");

在软件发行时,有时会有多个版本,比如XXX专业版,XXX社区版之类的。那么这个软件内部可能就是通过代码裁剪的方式实现的,从专业版中裁剪掉了一部分功能,然后作为社区版使用。

我们使用一下指令可以生成预处理之后的文件:

gcc -E code.c -o code.i

-E表示从现在开始进行程序的翻译,当我们的程序与处理完毕之后,翻译工作就停下来。

我们可以使用vim查看code.i里面的内容。

4.2、编译

编译后生成汇编文件。

我们使用以下命令,生成汇编文件:

cpp 复制代码
gcc -S code.i -o code.s

在预处理时候,我们的文件还是C语言,在编译之后,我们能看出来这不是C语言了,而是汇编语言。我就不解释了,因为我也看不懂o(╥﹏╥)o

为什么要先变成汇编语言,再变成可执行程序呢? 大家都知道,在最开始的时候,大概几十年之前,那时候的程序员都是使用二进制编程。 后来,人们发现这太不方便了。就发明了汇编语言 。汇编语言诞生之后,我们就得有能够翻译汇编语言的编译器。再后来,语言又发展出了C语言,当然了后面又发展出了C++,C++作为基座语言,根据C++写的解释器,有诞生出了python,php这种解释性语言,或者java这种半解释性语言。当然这不是重点,我们就说C语言,大家可以想一想,编译C语言的编译器,是直接翻译成二进制,还是站在前人的肩膀上,把C语言先变成汇编语言,再利用汇编语言的编译器,翻译成二进制呢?答案很明显,C语言先经过编译编程汇编语言更方便。

在语言发展初期,编译这个语言的编译器是哪之前的语言写的,比如汇编语言是用二进制写的,C语言是用汇编写的。在语言发展的过程中,这个语言强大到可以自己编写自己的编译器,即该语言足够强大到能够描述自身的编译器。这个就叫编译器自举。

4.3、汇编

我们执行下面的命令:

bash 复制代码
gcc -c code.s -o code.o

执行之后打开文件,发现全是乱码,更看不懂了。但是其实这不是乱码,而是一个二进制文件,确切来说是可重定位目标二进制文件。这个文件是无法执行的。只有在和C标准库进行链接之后,才能形成真正的可执行程序。

4.4、链接

执行以下命令:

bash 复制代码
gcc code.o -o code

至此就形成了可执行程序。

下面我们来理解一下链接的过程。

我们的代码中会调用一些库函数,这些库函数是前人们已经提前写好的,放在库中,我们在链接的过程,就是把这些库函数所在的内存地址与我们的代码链接起来,这样我们执行代码的时候就直接去调用库中的函数。 这个函数存在在我们的内存中,就意味着,我们系统里其实提前已经装好了许多库。这些库放在usr/include/目录下。在Linux系统中,库的命名一般都是libXXX.so.XX。

库又分为静态库和动态库,因此链接也分为动态链接和静态链接。 其中静态库只能静态链接,动态库一般是动态链接,特殊情况也可以静态链接。默认情况下我们的链接都是动态链接,如果想实现静态链接,我们在链接的时候末尾加上-static。

但是静态库不是默认就安装的,我们可以执行以下命令安装:

cpp 复制代码
sudo yum groupinstall "Development Tools"
sudo yum install glibc-static libstdc++-static

我们会发现,静态链接的文件比动态链接的文件大很多,为什么呢?

我们结合图来理解一下动态链接和静态链接的过程:

动态链接:

静态链接:

**我们可以理解为,动态库就是各种连接,把方法的地址链接到我们代码中。静态库呢就没那么复杂了,直接暴力的把库中的方法拷贝到我们的代码中。**这也就解释了为什么静态链接后的文件比动态链接大很多。

动态链接的优点是节省资源,但是缺点是一旦动态库丢失,所有程序就无法运行了。并且比静态链接稍微慢一点。

静态链接的优点是不依赖任何库,自己独立运行,缺点是体积大,占据资源多。

5、Linux生态

基于Linux的系统也分为好多种,比如Ubuntu ,Fedora ,CentOS。 操作系统的好坏要从操作系统的生态角度来看,因为大家都是基于LInux内核的,其他方面是差不多的。

**操作系统的生态包括社区论坛,官网文档,软件体系,维护更新速度,操作系统自身,富有针对性的客户群体。**一般在选择操作系统时,使用该操作系统的人越多,我们就更倾向于使用某个操作系统。因为使用的人越多,一般他的社区论坛更新就越快,软件体系丰富,官方文档也更全。并且,不同的操作系统,客户群体是不一样的,有的可能学生居多,有的可能专业的工程师,黑客居多。

所以说,生态很重要。如果一个操作系统再完美,底层再好,没有人去使用,那也算不上好的操作系统。操作系统之争,实际上是生态之争。

好了,今天的内容就分享到这,我们下期再见!

相关推荐
晚风_END5 分钟前
Linux|服务器|二进制部署nacos(不是集群,单实例)(2025了,不允许还有人不会部署nacos)
linux·运维·服务器·数据库·编辑器·个人开发
阿沁QWQ26 分钟前
应用层协议和JSON的使用
运维·服务器·网络
I'mSQL1 小时前
C#与FX5U进行Socket通信
运维·服务器·自动化·wpf
Gene_20221 小时前
[TOOL] ubuntu 使用 ffmpeg 操作 gif、mp4
linux·ubuntu·ffmpeg
极光雨雨2 小时前
【设计模式】策略模式(政策(Policy)模式)
设计模式·bash·策略模式
哈哈浩丶2 小时前
Linux驱动开发2:字符设备驱动
linux·运维·驱动开发
啊森要自信2 小时前
【Linux 学习指南】网络基础概念(一):从协议到分层,看透计算机通信的底层逻辑
linux·运维·服务器·网络·网络协议·tcp/ip·ip
asdfg12589632 小时前
策略路由Policy-Based Routing(PBR)
linux·网络·wireshark·网络工程·策略路由
小坏坏的大世界2 小时前
ROS2中的QoS(Quality of Service)详解
linux·机器人
Ronin3053 小时前
【Linux系统】进程状态 | 进程优先级
linux·运维·服务器·ubuntu