Linux基础开发工具----yum、vim和gcc/g++

1.Linux中安装软件

一、Linux中安装软件:

1.源码安装

2.软件包安装 --- rpm

3.包管理器yum(CentOS)、apt/apt-get(Ubuntu)

二、怎么安装软件?

a.网络下载

网络下载软件不仅要下载这个软件,还要下载软件所依赖的库,二者相互依赖

b.安装(就是拷贝)

而拷贝文件必须使用root权限。安装到系统里面,只要安装一次,任何人都能使用!

三、为什么推荐使用包管理器?

包管理器类似于我们手机上的应用商店,会自动给我们解决包的依赖问题。

1.1Linux上的软件谁提供的?

在 Linux 系统中,软件的提供方并非单一主体,而是由官方社区、商业公司、第三方开发者 / 组织等多个角色共同构成。

一、我们在Linux上下的软件大多都是免费的,那他靠什么赚钱?

一款操作系统的好坏取决于其生态(内核版本、用户社区、文档、使用人群、使用过程中遇到的问题)。而一款操作系统背后的配套软件也算是生态中的一环。

有了优质的生态,就有大量的人群使用这个操作系统,使用这个操作系统的人群自然就不希望他倒闭,可以靠募捐或其他商品进行获利

1.2我们的机器是怎么知道下载链接的?

而这些软件和操作系统大多都是国外开发的,想要下载使用就要去外部链接进行下载,而因为国内互联网的管控,想要访问这些外部链接就需要特定的VPN,于是国内就存在一些社区将国外社区的这些软件都镜像(拷贝)过来了。我们可以通过这些社区链接进行下载。

一、包管理器虽然能帮我们下载和安装软件,但首先也得知道下载链接,那这个下载链接他是从何得知的呢?

其实操作系统内部,内置链接

1.3这些内置链接(镜像源)在哪?

在/etc/yum.repos.d/中

我这边是买的阿里云的服务器,所以内置的是阿里云的镜像源,如果是虚拟机的话,内置的就是国外社区的链接。

虚拟机的镜像源可以根据用户的设置进行调整,用户既可以选择使用虚拟机软件自带的镜像源,也可以手动配置为国内的镜像源,如清华大学开源软件镜像站、中国科学技术大学开源软件镜像站等,以提高下载速度和稳定性。

1.4怎么更改镜像源?

2.软件包管理器

2.1什么是软件包

• 在Linux下安装软件,⼀个通常的办法是下载到程序的源代码,并进⾏编译,得到可执⾏程序.

• 但是这样太⿇烦了,于是有些⼈把⼀些常⽤的软件提前编译好,做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上,通过包管理器可以很⽅便的获取到这个编译好的软件包,直接进⾏安 装.

• 软件包和软件包管理器,就好⽐"App"和"应⽤商店"这样的关系.

• yum(Yellow dog Updater,Modified)是Linux下⾮常常⽤的⼀种包管理器.主要应⽤在Fedora, RedHat,Centos等发⾏版上.

• Ubuntu:主要使⽤apt(Advanced Package Tool)作为其包管理器。apt同样提供了⾃动解决依 赖关系、下载和安装软件包的功能。

3.yum具体操作

1.yum list 命令可以罗列出当前⼀共有哪些软件包,由于包的数⽬可能⾮常之多,这⾥我们需要使⽤ grep 命令只筛选出我们关注的包。

2.安装软件

Centos :sudo yum install -y lrzsz

Ubuntu :sudo apt install -y lrzsz

安装软件时由于需要向系统⽬录中写⼊内容,⼀般需要 sudo 或者切到 root 账⼾下才能完成.

3.卸载软件

Centos :sudo yum remove [-y] lrzsz

Ubuntu :sudo apt remove [-y] lrzsz

4.编辑器Vim

vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所 有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以运⾏于x window、mac os、windows。

4.1vim常用模式

常用的三种模式:命令模式(command mode)、插⼊模式(Insert mode)和底⾏模式(last line mode)

• 命令模式:控制屏幕光标的移动,字符、字或⾏的删除,移动复制某区段及进⼊插入模式下,或者到底行模式。

• 插⼊模式:只有在插⼊模式下,才可以做⽂字输⼊,按「ESC」键可回到命令⾏模式。该模式是我们后⾯⽤ 的最频繁的编辑模式。

• 底⾏模式:⽂件保存或退出,也可以进⾏⽂件替换,找字符串,列出⾏号等操作。 在命令模式下,*shift+:*即可进⼊该模式。

要查看你的所有模式:打开vim,底⾏模式直接输⼊ :help vim-modes

4.2V-VBLOCK模式(批量注释)

Vim 中的 Visual 模式(包括行可视化模式 V 和块可视化模式 Ctrl+v,可统称为 "V-BLOCK 相关模式") 的核心作用就是批量操作选中的文本区域。

行可视化模式(按 V 进入)

块可视化模式(按 ctrl+v 进入)

  • V(行可视化)适合整行级别的批量处理
  • Ctrl+v(块可视化)适合列 / 矩形区域的精准批量处理

我们主要使用块可视化模式进行批量化注释和解注释。
在命令模式下

批量化注释

1.ctrl+v进入V-BLOCK模式

2.使用hjkl控制光标移动选择矩形区域

3.shift+i(即I)进入插入模式,输入你想要的内容,则可以批量操作,如:输入//再按Esc后即可批量化注释

4.Esc批量化操作选中的矩形区域

批量化解注释

1.ctrl+v进入V-BLOCK模式

2.使用hjkl控制光标移动选中注释(//),按d即可删除

4.3插入模式

• 按「i」 进⼊插⼊模式后,是从光标当前位置开始输⼊ ⽂件;

• 按「a」进⼊插⼊模式后,是从⽬前光标所在位置的下⼀个位置开始输⼊⽂字;

• 按「o」进⼊插⼊模式后,是插⼊新的⼀⾏,从⾏⾸开始输⼊⽂字。

4.4命令模式命令集

快速定位光标

• gg:将光标快速定位到第一行

• shift+g(即G):将光标快速定位到最后一行

• shift+4(即$):将光标快速定位到当前行的最右侧

• shift+6(即^):将光标快速定位到当前行的最左侧

控制光标移动

• 控制光标移动:H(左)、J(下)、K(上)、L(右)。使用方向键也可以

• w:在当前行以单词为单位向右移动,光标跳到下个字的开头

• b:在当前行以单词为单位向左移动,光标回到上个字的开头

• e:在当前行以单词为单位向右移动,光标跳到下个字的字尾

快捷操作

• yy:复制当前行

• dd:剪切当前行(可以当作删除来使用)

• p:在光标所在位置进行粘贴

撤销操作

• u:相当于ctrl+z

• ctrl+r:相当于ctrl+y

一旦退出文件编辑(wq),无法再进行撤销。如果只是保存没有退出(w),还可以撤销

删除操作

• x:光标左侧不动,向右删除一个字符

• shift+x(即X):光标右侧不动,向左删除一个字符

替换操作

• r:替换光标所在位置字符,r+a就是将光标所在位置字符替换成a

• shift+r(即R):批量替换光标所在位置字符(按Esc可退出)

• shift + ~:将光标所在位置的字符进行大小写替换操作,如:可以将h替换成H

查找

• shift+3(即#):选中单词

• n:逆向查找

切换文件

如果打开了多个文件,想在命令模式下切换到其他文件,使用ctrl+ww切换文件。、

推出文件

• shift+zz:退出文件

注意:上述某些命令在使用之前使用数字按键可以批量进行操作,如10+p:粘贴10次。

4.5底行模式命令集

在命令模式下,按shift + :进入底行模式

• w:保存文件

• q退出文件

• wq:保存并退出文件

注意:给上述三个操作加上 ! 表示强制操作,如 q! 表示强制退出

• x! 保存并退出编辑,仅当文件有修改时会保存,并修改文件时间属性

• set nu:显示行号

• !command:!后面的内容表示指令,如 !pwd 就是pwd指令

• %s/dst/src/:将文件中所有dst(指定内容)替换成src(指定内容)

在vim的底行模式中,

:s 表示substitute,也就是替换, 格式为以下

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

• range 表示区间, % 用于表示全文, 2,3 表示从第2行开始到第3行

• {pattern} 表示字符串匹配规则,要匹配什么样的字符串 , 比如^a 表示以a字符起始的字符串

• {string} 表示要将匹配到的字符串替换为的新的string字符串

• [flags] s_flags中,g比较常用,通常使用g表示全部替换,默认如果不给的话,表示只替换一次

• [count] 表示在一行中匹配多少次,很少会用到....

如果想要将文件中所有 nihao 替换为 hello 则命令为: %s/nihao/hello/g

:p 用于打印指定区间的行

:[range]p[rint] [flags]

:i 在指定行上方添加文本

:{range}i[nsert][!]

• vs new_src(文件名):打开一个新文件

(在命令模式下可以使用ctrl+ww切换文件)

4.6使用vim的技巧

• vim 文件名->wq->自动生成该文件

• !+内容:执行最近一条以该内容为开头的指令,如下面 !v 就是执行最近一条以v开头的指令

• vim src(文件名) +n(数字):进入文件的第n行。

因为我们vim进一个文件时,光标会重新定位至上次退出该文件时光标所处行。vim src(文件名) +1即进入src文件时,指定光标定位在第1行。

4.7vim配置

配置⽂件在 /etc/vimrc 中,这是系统中公共的vim配置⽂件,配置这里的vimrc文件对所有⽤⼾都有效。

• ⽽在每个⽤⼾的家⽬录下,都可以⾃⼰建⽴私有的配置⽂件,命名为:".vimrc"。

• 打开⾃⼰家⽬录下的.vimrc⽂件,执⾏ vim .vimrc ,然后就可以对该用户的vim编辑器进行配置。
如果你的linux是CentOS 7版本的,可以执行以下指令进行一键化配置:

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

如果不是,可以将以下内容复制进当前用户家目录下的 .vimrc 文件中进行简单配置。

cpp 复制代码
:set nu	 "设置显示行号
:set backspace=2 "能使用backspace回删
:syntax on "语法检测
:set ruler "显示最后一行的状态
:set bg=dark "背景色设置
:set hlsearch "高亮度反白
:set laststatus=2 "两行状态行+一行命令行
:set cindent "设置c语言自动对其
:set t_Co=256 "指定配色方案为256
:set mouse=a "设置可以在VIM使用鼠标
:set tabstop=4 "设置TAB宽度
:set history=1000 "设置历史记录条数
"PATHOGEN配置
:filetype  plugin on "允许插件
:filetype  plugin indent on  "启动智能补全

"配置nerdtree使用F3打开关闭
map <F3> :NERDTreeMirror <CR>
map <F3> :NERDTreeToggle <CR>
"NERDTree配置
let NERDChristmasTree=1       "显示增强
let NERDTreeAutoCenter=1      "自动调整焦点
let NERDTreeShowFiles=1       "显示文件
let NERDTreeShowLineNumbers=1 "显示行号
let NERDTreeHightCursorline=1 "高亮当前文件
let NERDTreeShowHidden=0      "显示隐藏文件
let NERDTreeMinimalUI=0       "不显示'Bookmarks' label 'Press ? for help'
let NERDTreeWinSize=31        "窗口宽度
"配置Supertab
let g:SuperTabRetainCompletionType=2 "记住上次的补全方式,直到按Esc退出插入模式位置
"let g:SuperTabDefaultCompletionType="<c-x><c-o>" "按下tab后默认补全方式为<c-p>,现在改为<c-x><c-o> 

"默认最大化窗口打开
au GUIEnter * simalt ~x 
"taglist配置信息
 let Tlist_Auto_Open=1 " Let the tag list open automatically
 let Tlist_Auto_Update=1 " Update the tag list automatically
 let Tlist_Compact_Format=1 " Hide help menu
 let Tlist_Ctags_Cmd='ctags' " Location of ctags
 let Tlist_Enable_Fold_Column=0 "do show folding tree
 let Tlist_Process_File_Always=1 " Always process the source file
 let Tlist_Show_One_File=1 " Only show the tag list of current file
 let Tlist_Exist_OnlyWindow=1 " If you are the last, kill yourself
 let Tlist_File_Fold_Auto_Close=0 " Fold closed other trees
 let Tlist_Sort_Type="name" " Order by name
 let Tlist_WinWidth=30 " Set the window 40 cols wide.
 let Tlist_Close_On_Select=1 " Close the list when a item is selected
 let Tlist_Use_SingleClick=1 "Go To Target By SingleClick
 let Tlist_Use_Right_Window=1 "在右侧显示
 map <silent> <F2> :TlistToggle<CR>   
 "打开关闭快捷键
 
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

""实用设置

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 设置当文件被改动时自动载入

set autoread

" quickfix模式

autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>

"代码补全 

set completeopt=preview,menu 

"允许插件  

filetype plugin on

"共享剪贴板  

set clipboard+=unnamed 

"从不备份  

set nobackup

"make 运行

:set makeprg=g++\ -Wall\ \ %

"自动保存

set autowrite

set ruler                   " 打开状态栏标尺

set cursorline              " 突出显示当前行

set magic                   " 设置魔术

set guioptions-=T           " 隐藏工具栏

set guioptions-=m           " 隐藏菜单栏

"set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\

" 设置在状态行显示的信息

set foldcolumn=0

set foldmethod=indent 

set foldlevel=3 

set foldenable              " 开始折叠

" 不要使用vi的键盘模式,而是vim自己的

set nocompatible

" 语法高亮

set syntax=on

" 去掉输入错误的提示声音

set noeb

" 在处理未保存或只读文件的时候,弹出确认

set confirm

" 自动缩进

set autoindent

set cindent

" Tab键的宽度

set tabstop=4

" 统一缩进为4

set softtabstop=4

set shiftwidth=4

" 不要用空格代替制表符

set noexpandtab

" 在行和段开始处使用制表符

set smarttab

" 显示行号

set number

" 历史记录数

set history=1000

"禁止生成临时文件

set nobackup

set noswapfile

"搜索忽略大小写

set ignorecase

"搜索逐字符高亮

set hlsearch

set incsearch

"行内替换

set gdefault

"编码设置

set enc=utf-8

set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936

"语言设置

set langmenu=zh_CN.UTF-8

set helplang=cn

" 我的状态行显示的内容(包括文件类型和解码)

"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}

"set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]

" 总是显示状态行

set laststatus=2

" 命令行(在状态行下)的高度,默认为1,这里是2

set cmdheight=2

" 侦测文件类型

filetype on

" 载入文件类型插件

filetype plugin on

" 为特定文件类型载入相关缩进文件

filetype indent on

" 保存全局变量

set viminfo+=!

" 带有如下符号的单词不要被换行分割

set iskeyword+=_,$,@,%,#,-

" 字符间插入的像素行数目

set linespace=0

" 增强模式中的命令行自动完成操作

set wildmenu

" 使回格键(backspace)正常处理indent, eol, start等

set backspace=2

" 允许backspace和光标键跨越行边界

set whichwrap+=<,>,h,l

" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)

set mouse=a

set selection=exclusive

set selectmode=mouse,key

" 通过使用: commands命令,告诉我们文件的哪一行被改变过

set report=0

" 在被分割的窗口间显示空白,便于阅读

set fillchars=vert:\ ,stl:\ ,stlnc:\

" 高亮显示匹配的括号

set showmatch

" 匹配括号高亮的时间(单位是十分之一秒)

set matchtime=1

" 光标移动到buffer的顶部和底部时保持3行距离

set scrolloff=3

" 为C程序提供自动缩进

set smartindent

" 高亮显示普通txt文件(需要txt.vim脚本)

au BufRead,BufNewFile *  setfiletype txt

"自动补全

:inoremap ( ()<ESC>i

:inoremap ) <c-r>=ClosePair(')')<CR>

:inoremap { {<CR>}<ESC>O

:inoremap } <c-r>=ClosePair('}')<CR>

:inoremap [ []<ESC>i

:inoremap ] <c-r>=ClosePair(']')<CR>

:inoremap " ""<ESC>i

:inoremap ' ''<ESC>i

function! ClosePair(char)

    if getline('.')[col('.') - 1] == a:char

        return "\<Right>"

    else

        return a:char

    endif

endfunction

filetype plugin indent on 

"打开文件类型检测, 加了这句才可以用智能补全

set completeopt=longest,menu

4.8获取sudo权限

首先登陆root账号,然后使用vim编译器进入/etc/sudoers文件,在以下这个位置添加允许使用sudo指令的普通用户,如下是添加一个名为wsj的普通用户。

5.编译器gcc/g++

5.1文件编译的四个过程

1.预处理(进⾏宏替换/去注释/条件编译/头⽂件展开等) ,-E选项,.i文件

2.编译(⽣成汇编) ,-S选项,.s文件

3.汇编(⽣成机器可识别代码),-c选项,.o文件

4.连接(⽣成可执⾏⽂件或库⽂件) .out文件

5.2几个子问题

1.如何理解条件编译?

条件编译的用途?

1.跨平台 / 跨环境适配

不同操作系统(如 Windows、Linux、macOS)或硬件平台(如 x86、ARM)的 API、编译规则可能存在差异。通过条件编译可以针对不同平台编写适配代码,确保同一套源码在不同环境下正常编译运行。

2.调试与发布版本区分

开发阶段常需要打印调试信息(如日志、变量值),但发布版本需移除这些代码以提高性能和安全性。通过条件编译可在不修改代码逻辑的情况下切换模式。

3.代码功能裁剪与模块化

对于大型项目,可通过条件编译选择性启用 / 禁用某些模块或功能(如可选插件、扩展功能),减少编译后程序的体积,提高灵活性。

4.版本兼容与特性控制

当依赖的库或编译器存在版本差异时,可通过条件编译适配不同版本的特性。例如,针对 C++11 和 C++17 的不同语法特性编写兼容代码。

5.避免头文件重复包含

通过#ifndef#define#endif组合(头文件保护符)防止头文件被多次包含导致的重复定义错误,是条件编译的基础应用之一。

2.为什么C/C++编译,要先变成汇编?

因为一种语言想要可执行就得转换成二进制语言,而汇编语言比现在的其他语言先出现,汇编语言已经实现了向二进制语言的转换,相比于直接转换成二进制语言,先转换成汇编语言显然是比较简单的,所以C/C++编译,选择了先变成汇编。

5.3动态库和静态库

• 什么是库?库是一套方法或者数据集,为我们开发提供最基本的保证(基本接口,功能,加速我们二次开发)

• 动态库和静态库在Linux和windows下的后缀如下,一个库的真正名字需要去除前缀(lib)和后缀(.so/.a),例:libc.so这个动态库的名字就是c

动态链接和静态链接

• 动态链接:当我们的程序使用到库中的方法时,执行目标方法,需要跳转到库中执行,完了再返回,让我们自己的程序能在库中找到方法从而形成可执行程序。

  • 特点
    • 可执行文件体积小(仅包含自身代码和库引用);
    • 多个程序可共享同一动态库的内存副本(节省内存);
    • 库更新后,无需重新编译程序(只要接口兼容),直接替换库文件即可生效。

• 静态链接:当我们的程序使用到库中的方法时,将目标方法直接拷贝至我们的程序中,不需要跳转至库中。

  • 特点
    • 可执行文件体积较大(包含了库的代码);
    • 移植性好(不依赖外部库,拷贝可执行文件即可运行);
    • 若库更新,必须重新编译链接程序才能生效。

• 动态库的本质:把语言层面公共的代码,在内存中未来只出现一份。

• 库的本质:是目标文件(.o,也称为目标代码)的 "打包集合",无论是静态库还是动态库,其核心都是将多个编译后的.o文件通过工具整合在一起,方便管理和复用。

相关推荐
newxtc2 小时前
【辽宁政务服务网-注册_登录安全分析报告】
运维·selenium·安全·政务·安全爆破
_w_z_j_2 小时前
Linux----文件系统
linux·运维·服务器
测试-鹏哥3 小时前
要将ITP集成到Jenkins Pipeline中,实现开发发版时自动触发自动化测试
运维·python·测试工具·ci/cd·jenkins
SKYDROID云卓小助手3 小时前
无人设备遥控器之数字图传技术
运维·服务器·单片机·嵌入式硬件·fpga开发
努力努力再努力wz3 小时前
【Linux进阶系列】:线程(上)
java·linux·运维·服务器·数据结构·c++·redis
java 乐山4 小时前
蓝牙网关(备份)
linux·网络·算法
2301_803554524 小时前
面试后查缺补漏--cmake,makefiles,g++,gcc(自写精华版)
linux·运维·服务器
煤球王子4 小时前
浅学任务调度
linux
102400244 小时前
ubuntu系统中 jupyter Kernel 频繁崩溃原因
linux·运维·服务器