一、軟件包管理器yum
1.什么是軟件包
在linux下安裝軟件, 通常的辦法是下載程序的源代碼、編譯、得到可執(zhí)行程序。但是這樣麻煩、不便于操作,于是一些人把常用的軟件提前編譯好, 做成軟件包(可以理解成windows上的安裝包)放在一個(gè)服務(wù)器上, 通過(guò)包管理器可以很方便的獲取到這個(gè)編譯好的軟件包, 直接進(jìn)行安裝。
軟件包和軟件包管理器, 就好比 "App" 和 "應(yīng)用商店" 這樣的關(guān)系。
yum是Linux下非常常用的一種包管理器. 主要應(yīng)用在Fedora, RedHat, centos等發(fā)行版上。
2.ping
由于yum是從服務(wù)器上獲取安裝包,關(guān)于 yum 的所有操作必須保證主機(jī)(虛擬機(jī))網(wǎng)絡(luò)暢通,網(wǎng)絡(luò)是否暢通可以通過(guò) ping 指令驗(yàn)證。

3.查看所有軟件包
通過(guò)yum list可以看到所有的軟件包(軟件包有很多,下圖只截取了其中一部分)。

通過(guò)與grep命令配合可以搜索出指定的軟件包。

4.安裝軟件包
通過(guò)sudo yum install xxx可安裝xxx軟件,這里以lrzsz為例進(jìn)行安裝。

5.卸載軟件包
卸載指令sudo yum remove xxx可卸載xxx軟件包,操作同上。
二、編輯器vim
0.vim的配置
原生的vim不便于使用,需要通過(guò)配置來(lái)讓它的使用更加方便。
(1)配置文件
在目錄 /etc/ 下面,有一個(gè)名為vimrc的文件,這是系統(tǒng)中公共的vim配置文件,對(duì)所有用戶都有效。而在每個(gè)用戶的主目錄下,都可以自己建立私有的配置文件,命名為:.vimrc,在這里配置的vim不會(huì)影響其他用戶。
進(jìn)入用戶的主工作目錄,找到自己目錄下的.vimrc文件,執(zhí)行 vim .vimrc,即可配置自己的vim。
(2)配置vim
在其中輸入特殊的命令即可修改vim的選項(xiàng),可以用下面三條命令進(jìn)行測(cè)試。
設(shè)置語(yǔ)法高亮: syntax on 顯示行號(hào): set nu 設(shè)置縮進(jìn)的空格數(shù)為4: set shiftwidth=4
在shell命令行中執(zhí)行下面的指令(想在哪個(gè)用戶下讓vim配置生效, 就在哪個(gè)用戶下執(zhí)行這個(gè)指令. 強(qiáng)烈 "不推薦" 直接在 root 下執(zhí)行),根據(jù)提示操作,即可將vim變成一個(gè)c++編譯器。
curl -sLf gitee.com/HGtz2222/Vi… -o ./install.sh && bash ./install.sh
(原文地址:gitee.com/HGtz2222/Vi…
1.vim的模式
vim有許多模式,在我使用的服務(wù)器上有七種基本模式和六種附加模式。

本文只介紹常用的三種模式:命令模式(Normal mode)、插入模式(Insert mode)、底行模式(last line mode)。
2.模式間的轉(zhuǎn)變
先上一張圖表示三種模式的關(guān)系。
vim打開(kāi)時(shí)默認(rèn)是命令模式,如下。

此時(shí)如果輸入一般的代碼很可能沒(méi)有響應(yīng),因?yàn)樵诿钅J较拢瑅im將輸入的內(nèi)容當(dāng)做命令看待,如果我們按照代碼輸入,就很難會(huì)出現(xiàn)命令,所以大多數(shù)時(shí)候沒(méi)有反應(yīng)。
此時(shí)如果按一下i就可以轉(zhuǎn)入插入模式,左下角會(huì)變成下圖的樣子,表示進(jìn)入插入模式,這時(shí)就可以在編輯器內(nèi)輸入內(nèi)容。

這時(shí)再按Esc退回普通/命令模式。

如果想要退出vim,則要在底行模式(shift+;即輸入一個(gè):)下輸入q退出。輸入w可以保存,但配置過(guò)的vim編輯器會(huì)自動(dòng)保存,所以w可省略;如果用的是原生的vim(沒(méi)有配置過(guò)的),就需要手動(dòng)保存。

3.命令模式(Normal mode)
(1)命令模式向插入模式轉(zhuǎn)換
命令模式向插入模式轉(zhuǎn)換可以輸入:a(光標(biāo)向后移動(dòng)一個(gè)字符后進(jìn)入插入模式),i(直接進(jìn)入插入模式),o(換行后進(jìn)入插入模式)。
(2)命令模式下常用的編輯命令
shift+^:光標(biāo)定位到當(dāng)前行的開(kāi)頭
shift+$:光標(biāo)定位到當(dāng)前行的末尾
shift+g:光標(biāo)定位到當(dāng)前文本的最后一個(gè)位置
gg:光標(biāo)定位到當(dāng)前文本的第一個(gè)位置
n+shift+g:光標(biāo)定位到當(dāng)前文本第n行的開(kāi)頭
yy:復(fù)制光標(biāo)所在行
n+yy:從光標(biāo)所在行開(kāi)始,復(fù)制下面n行的內(nèi)容
p:粘貼內(nèi)容
n+p:將內(nèi)容粘貼n行
u:撤銷(xiāo)
ctrl+r:恢復(fù)剛剛的撤銷(xiāo)
dd:刪除光標(biāo)所在的行(這里是剪切,也就是說(shuō)刪除后可直接粘貼被刪除的內(nèi)容)
n+dd:從光標(biāo)所在行開(kāi)始,刪除下面n行的內(nèi)容
shift+~:對(duì)光標(biāo)所在的位置進(jìn)行大小寫(xiě)轉(zhuǎn)換
w:以“單詞”為單位進(jìn)行跳轉(zhuǎn),跳到下一個(gè)“單詞”的開(kāi)頭(從左往右,從上到下)
b:以“單詞”為單位進(jìn)行跳轉(zhuǎn),跳到上一個(gè)“單詞”的開(kāi)頭(從右往左,從下到上)
e:以“單詞”為單位進(jìn)行跳轉(zhuǎn),跳到下一個(gè)“單詞”的結(jié)尾(從左往右,從上到下)
(這里的“單詞”可能是一組字母,也可能是符號(hào))
x:刪除光標(biāo)所在位置的內(nèi)容
n+x:刪除從光標(biāo)開(kāi)始n個(gè)位置的內(nèi)容
shift+x:刪除光標(biāo)之前位置的內(nèi)容(不包括光標(biāo)所在位置)
shift+n+x:刪除光標(biāo)之前x個(gè)位置的內(nèi)容(不包括光標(biāo)所在位置)
r:輸入r之后再輸入內(nèi)容會(huì)將光標(biāo)所在位置的內(nèi)容進(jìn)行替換
n+r:替換從光標(biāo)開(kāi)始n個(gè)位置的內(nèi)容(每個(gè)位置的內(nèi)容都一樣)
shift+r:進(jìn)入替換模式,下面的操作全部是替換(按Esc返回命令模式)
h、j、k、l:左、下、上、右(和方向鍵的功能相同,但是建議用字母而不是方向鍵,因?yàn)榉较蜴I可能出現(xiàn)不兼容的問(wèn)題)
ctrl+b:下翻一頁(yè)
ctrl+f:上翻一頁(yè)
ctrl+u:下翻半頁(yè)
ctrl+d:上翻半頁(yè)
復(fù)制代碼
在命令模式下進(jìn)行文本編輯的效率非常高,所以建議盡量在命令模式下編輯。
4.插入模式(Insert mode)
命令模式按a/i/o進(jìn)如插入模式,插入模式與Windows下正常的文本編輯沒(méi)什么區(qū)別,此處不再贅述。
5.底行模式(last line mode)
命令模式shift+;進(jìn)入底行模式,常用的命令如下:
set nu:設(shè)置行號(hào)
set nonu:取消行號(hào)
w:寫(xiě)入(保存)
w!:強(qiáng)制寫(xiě)入(但也有可能寫(xiě)入不成功)
q:退出
q!:強(qiáng)制退出
!+其他命令:在底行模式下,輸入!后即可執(zhí)行l(wèi)s,ll,gcc等命令,即不退出vim就看執(zhí)行命令行的命令
復(fù)制代碼
vs命令+filename:分屏顯示,若filename不存在,則會(huì)新建。


通過(guò)ctrl+w+w可在多個(gè)選項(xiàng)卡之間切換。
注意分屏不僅僅可以分兩個(gè),分屏可以分許多個(gè)。

底行模式下退出分屏?xí)r,光標(biāo)在哪個(gè)文件就退出哪個(gè)文件。
三、編譯器gcc/g++
gcc用來(lái)對(duì)C語(yǔ)言文件編譯,g++用來(lái)對(duì)c++文件編譯,選項(xiàng)幾乎是一樣的,下面以gcc為例。
1.從源文件到可執(zhí)行文件
從一個(gè).c為后綴的源文件到一個(gè).exe為后綴的可執(zhí)行文件需要經(jīng)過(guò)下面四個(gè)步驟。
(1)預(yù)處理(-E)
主要包括:頭文件展開(kāi)、去注釋、宏替換、條件編譯。 在Linux中可以通過(guò)gcc的–E選項(xiàng)來(lái)讓源文件在預(yù)處理結(jié)束后停止并生成同名的.i后綴文件。
(2)編譯(-S)
檢查代碼的規(guī)范性、是否有語(yǔ)法錯(cuò)誤等,以確定代碼實(shí)際要做的工作,在檢查 無(wú)誤后,把C語(yǔ)言代碼翻譯成匯編語(yǔ)言。 在Linux中可以通過(guò)gcc的–S選項(xiàng)來(lái)讓源文件在編譯結(jié)束后停止并生成同名的.s后綴文件。
(3)匯編(-c)
生成機(jī)器可識(shí)別代碼,把編譯階段生成的.s文件轉(zhuǎn)成目標(biāo).o文件,轉(zhuǎn)化結(jié)束后,文件是二進(jìn)制目標(biāo)文件。 在Linux中可以通過(guò)gcc的–c選項(xiàng)來(lái)讓源文件在匯編結(jié)束后停止并生成同名的.o后綴文件。
(4)鏈接(無(wú)選項(xiàng))
將代碼中庫(kù)函數(shù)的調(diào)用和庫(kù)中庫(kù)函數(shù)的實(shí)現(xiàn)關(guān)聯(lián)起來(lái)。
這里要介紹一個(gè)概念:函數(shù)庫(kù) 函數(shù)庫(kù)一般分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩種。
靜態(tài)庫(kù)
鏈接時(shí)把庫(kù)文件的代碼全部加入到可執(zhí)行文件中,因此生成的文件占用的空間比較大,但在運(yùn)行時(shí)也就不再需要庫(kù)文件了,這樣程序的可移植性強(qiáng)。 靜態(tài)庫(kù)后綴名一般為.a。
動(dòng)態(tài)庫(kù)
鏈接時(shí)不把庫(kù)文件的代碼加入到可執(zhí)行文件中,而是在程序執(zhí)行時(shí)由鏈接文件加載庫(kù),生成的文件體積小、速度快,但可移植性差。 動(dòng)態(tài)庫(kù)一般后綴名為.so。
gcc在鏈接時(shí)默認(rèn)使用動(dòng)態(tài)庫(kù)。
2.常用選項(xiàng)
除了上面的-E、-S、-c選項(xiàng)外,下面還有一些常用選項(xiàng)。
-static:此選項(xiàng)對(duì)生成的文件采用靜態(tài)鏈接 -O0、-O1、-O2、-O3:編譯器優(yōu)化選項(xiàng)的4個(gè)級(jí)別,-O0表示沒(méi)有優(yōu)化,-O3優(yōu)化級(jí)別最高 -w:不生成任何警告信息。 -Wall:生成所有警告信息。 -o+filename:將生成的文件命名為filename
四、調(diào)試器gdb
下面以一個(gè)簡(jiǎn)單的從1加到100的代碼演示調(diào)試,源文件生成的可執(zhí)行文件為Mytest。
代碼如下:
直接gdb+被調(diào)試文件名進(jìn)入調(diào)試,如下

但最后提示沒(méi)有調(diào)試信息。這里是因?yàn)樵贑entos 7 gcc中默認(rèn)生成的可執(zhí)行程序是release版本的,不可被調(diào)試。通過(guò)編譯時(shí)添加-g選項(xiàng)讓程序成為debug版本。

1.顯示代碼list/l
2.運(yùn)行r
3.斷點(diǎn)b、查看斷點(diǎn)info、刪除斷點(diǎn)d

4.逐過(guò)程n(不進(jìn)入函數(shù))、逐語(yǔ)句s(進(jìn)入函數(shù))

5.臨時(shí)查看變量的值p
6.添加查看display
7.取消查看undisplay
8.跳轉(zhuǎn)until
9.結(jié)束函數(shù)finish
10.跳轉(zhuǎn)到下一斷點(diǎn)c
11.退出調(diào)試quit
五、自動(dòng)化構(gòu)建:make+makefile
1.背景
一個(gè)工程中的源文件不計(jì)數(shù),其按類(lèi)型、功能、模塊分別放在若干個(gè)目錄中,makefile定義了一系列的規(guī)則來(lái)指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進(jìn)行更復(fù)雜的功能操作。 makefile帶來(lái)的好處就是——“自動(dòng)化編譯”,一旦寫(xiě)好,只需要一個(gè)make命令,整個(gè)工程完全自動(dòng)編譯,極大的提高了軟件開(kāi)發(fā)的效率。 make是一條命令,makefile是一個(gè)文件,兩個(gè)搭配使用,完成項(xiàng)目自動(dòng)化構(gòu)建
2.依賴(lài)關(guān)系、依賴(lài)方法
舉例如下:
makefile中一行是依賴(lài)關(guān)系,緊跟的一行是依賴(lài)方法。上面從一個(gè).c文件到一個(gè).exe文件經(jīng)歷的依賴(lài)關(guān)系和依賴(lài)方法寫(xiě)全后如下。
mytest依賴(lài)test.o經(jīng)過(guò)gcc鏈接得到,test.o依賴(lài)test.s經(jīng)過(guò)gcc -c匯編得到,test.s依賴(lài)test.i經(jīng)過(guò)gcc -S編譯得到,test.i依賴(lài)test.c經(jīng)過(guò)gcc -E預(yù)處理得到。 (冒號(hào)左邊是得到的文件,冒號(hào)右邊是被依賴(lài)的文件)
make后就可以得到所有需要的文件。
雖然這些過(guò)程在這個(gè)場(chǎng)景下可以gcc一步搞定,但是如果有其它多個(gè)文件需要處理,這么多行的指令寫(xiě)進(jìn)makefile后只需一個(gè)make即可全部執(zhí)行,效率有很大的提高。
3.項(xiàng)目清理
可以看到上面產(chǎn)生了許多文件,如果一個(gè)個(gè)清理又會(huì)很麻煩,在makefile中 加入clean選項(xiàng)便可像make那樣直接清除某些文件。
上面的.PHONY是偽目標(biāo),這樣寫(xiě)表示clean總是被執(zhí)行。
4.宏替換
$@:依賴(lài)關(guān)系中的目標(biāo)文件(冒號(hào)左邊的文件)
$^:依賴(lài)關(guān)系中的依賴(lài)文件列表(冒號(hào)右邊的所有文件)
$<:依賴(lài)關(guān)系中的一個(gè)依賴(lài)文件
將makefile修改為如下宏替換后的結(jié)果,這樣當(dāng)依賴(lài)文件或目標(biāo)文件改變時(shí),依賴(lài)方法不需要改變。
仍能正常運(yùn)行。
感謝閱讀,如有錯(cuò)誤請(qǐng)批評(píng)指正
作者:山舟
鏈接:
https://juejin.cn/post/7083141631775342606