目录
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 文件中进行简单配置。
: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文件通过工具整合在一起,方便管理和复用。










1944






