文章目錄
- 1.軟件包管理器yum
- 2.Linux編輯器vim
- 2.1 三模式切換
- 2.2 正常模式
- 2.3 底行模式
- 2.4 可視化模式
- 2.5 vim 配置
- 3.Linux編譯器gcc/g++
- 3.1 預處理
- 3.2 編譯
- 3.3 匯編
- 3.4 連接
- 3.5 函數庫
- 4.Linux自動化構建工具Makefile
- 5.Linux調試器gdb
- 希望讀者們多多三連支持
- 小編會繼續更新
- 你們的鼓勵就是我前進的動力!
本文將介紹關于 Linux
系統常用的工具包,便于后續的代碼操作
1.軟件包管理器yum
對于 Linux
系統來說,下載軟件是必不可少的,就像平常使用手機下載軟件一樣滿足我們的日常需求,一般 Linux
有三種下載方式:
- 源代碼下載: 從官網下載代碼自行配置,雖說可以充分利用代碼自行調配,但是上手使用難度太高
- rpm下載: 使用命令獲取文件安裝,但是會涉及該安裝包依賴于其他安裝包等問題,需要手動解決,過程繁瑣
- yum下載: 也是使用命令獲取文件安裝,能夠自動分析軟件包的依賴關系,并從
yum
源中下載并安裝所需的依賴包,大大簡化了軟件安裝過程,雖說安裝的版本可能不是最新的,但是簡單易上手,通常來說是夠用的
因此我們主要使用 yum
🤔那么yum是如何下載的呢?
其實也沒那么復雜,就拿手機來舉例,跟 Linux
系統一樣都叫做客戶端,yum
就相當于是手機里的應用市場,是一個軟件的倉庫地址,告訴 yum
去哪里找軟件,然后通過網絡在服務器里找到對應的軟件源來下載軟件包,軟件源又分為官方和第三方的
通常我們通過 yum list
查看可安裝軟件列表,或者 yum search 軟件名
進行軟件搜索
以rz、sz命令的下載為例
[zzh_test@hcss-ecs-6aa4 ~]$ yum list | grep rzsz
lrzsz.x86_64 0.12.20-36.el7 @base
我們查詢到該命令的安裝包為 lrzsz
yum install -y 軟件包名
下載的命令通常如上所示,-y
表示省略輸入是否同意安裝的步驟
對于該紅框的信息可以解釋為:
軟件包名稱: 主版本號,次版本號,源程序發行號-軟件包的發行號,主機平臺,cpu架構
x86_64
后綴表示 64
位系統的安裝包,i686
后綴表示 32
位系統安裝包,選擇包時要和系統匹配,el7
表示操作系統發行版的版本,el7
表示的是 centos7/redhat7
,el6
表示 centos6/redhat6
,最后一列,base
表示的是 “軟件源” 的名稱,類似于 “小米應用商店”,“華為應用商店” 這樣的概念
順便一提,rz
命令用于從 Windows
上傳文件到 Linux
,sz
命令用于從 Linux
下載文件到 Windows
,輸入命令后會彈出文件選擇對話框,選擇要上傳的文件即可,在本地直接拖動文件到窗口也是一樣的
yum remove 軟件包名
想要刪除可以輸入以上命令
🔥值得注意的是:
- 安裝軟件時由于需要向系統目錄中寫入內容,一般需要
sudo
或者切到root
賬戶下才能完成 yum
安裝軟件只能一個裝完了再裝另一個,正在yum
安裝一個軟件的過程中, 如果再嘗試用yum
安裝另外一個軟件,yum
會報錯
2.Linux編輯器vim
vim 文件名
進入編輯界面,可以理解為記事本,初始狀態下是命令模式
2.1 三模式切換
通常最常用的三個模式:
- 命令模式:
i
切換到插入模式,:(shift + ;)
切換到底行模式 - 插入模式:
esc
回到命令模式 - 底行模式:
esc
回到命令模式
命令模式就是使用命令控制屏幕光標的移動,字符、字或行的刪除,一般不做文本輸入;插入模式就是允許編輯的模式,是我們后面用的最頻繁的編輯模式;底行模式用于文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作
2.2 正常模式
正常模式就是命令模式,通常使用命令進行一些簡單的操作
移動:
gg
:定位光標到開頭行第一位G(shift + g)
:定位到結尾行第一位n + shift + g
:定位到第n
行文本第一位$(shift + 4)
:定位到當前行的文本最后一位^(shift + 6)
:定位到當前行的文本第一位w、b
:光標按照單詞進行行內、跨行移動h、j、k、l
:左下上右移動光標
復制粘貼:
(n)yy
:復制光標所在(n
)行(n)dd
:刪除(n
)行(n)p
:粘貼n
u
:撤回ctrl + r
:撤回之前的撤回
轉換:
~
:大小寫轉換(n)r
:對光標字符之后的所有字符進行批量化替換R(shirf + r)
:進入替換模式,對內容整體替換(n)x
:對光標字符之后的字符進行刪除
2.3 底行模式
在使用底行模式之前,請記住先按 esc
鍵確定您已經處于正常模式,再按 :
冒號即可進入底行模式
跳到文件中的某一行:
#
:#
號表示一個數字,在冒號后輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字15
,再回車,就會跳到文章的第15行
查找字符:
-
/ + 關鍵字
:先按/
鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按n
會往后尋找到您要的關鍵字為止,從當前光標位置向下(往后) 查找 -
? + 關鍵字
:先按?
鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按n
會往前尋找到您要的關鍵字為止,從當前光標位置向上(往前) 查找
保存文件:
w
:在冒號輸入字母w
就可以將文件保存起來離開vim
q
:按q
就是退出,如果無法離開vim
,可以在q
后跟一個!
強制離開vim
wq
:一般建議離開時,搭配w
一起使用,這樣在退出的時候還可以保存文件
2.4 可視化模式
可視化模式一般用于批量操作,比如批量加注釋:
批量注釋:
在正常模式下按 ctrl + v
,進入 V-BLOCK
模式,按 J
鍵 或 K
鍵選擇要注釋的內容,J
向上 K
向下,按住 shift + i
進入插入模式,輸入 //
,點擊 esc
鍵,完成注釋
批量取消注釋:
在正常模式下按 ctrl + v
,進入 V-BLOCK
模式,然后按兩下 L
鍵(右移兩格),選中注釋的符號,按 J
鍵或 K
鍵選擇要取消注釋的內容,按 d
鍵完成批量取消注釋
2.5 vim 配置
vim
可以通過在自己用戶下添加 .vimrc
的文件進行功能、風格等配置,為了能夠像在VS
、IDEA中那樣使用方便,可以自行上網進行配置搜索,這里我推薦一個配置項目
傳送門:VimForCpp
3.Linux編譯器gcc/g++
gcc/g++ [選項] 要編譯的文件 [選項] [目標文件]
gcc/g++
是一款語言編譯器,相當于 Linux
系統的 VS
,gcc
專門編譯 C
語言,g++
既可以編譯 C
語言,也可以編譯 C++
生成可執行文件直接 ./目標文件
執行即可
3.1 預處理
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar.c processBar.h
[zzh_test@hcss-ecs-6aa4 progressbar]$ gcc -E processBar.c -o processBar.i
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar.c processBar.h processBar.i
預處理功能主要包括宏定義,文件包含,條件編譯,去注釋等
-E
表示讓 gcc
在預處理結束后停止編譯過程,-o
后面一定是接目標文件,源頭文件放哪兒無所謂
3.2 編譯
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar.c processBar.h processBar.i
[zzh_test@hcss-ecs-6aa4 progressbar]$ gcc -S processBar.i -o processBar.s
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar processBar.c processBar.h processBar.i processBar.s
編譯主要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后, gcc
把代碼翻譯成匯編語言
-S
表示讓 gcc
在編譯結束后停止編譯過程,生成匯編代碼
3.3 匯編
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar processBar.c processBar.h processBar.i processBar.s
[zzh_test@hcss-ecs-6aa4 progressbar]$ gcc -c processBar.s -o processBar.o
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar.c processBar.h processBar.i processBar.o processBar.s
匯編主要生成機器可識別代碼
-c
表示讓 gcc
在匯編結束后停止編譯過程,生成二進制代碼
3.4 連接
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar.c processBar.h processBar.i processBar.o processBar.s
[zzh_test@hcss-ecs-6aa4 progressbar]$ gcc processBar.o -o processBar
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar processBar.c processBar.h processBar.i processBar.o processBar.s
連接表示連接函數庫生成可執行文件
3.5 函數庫
函數庫分為兩種類型的庫:
靜態庫:
靜態庫就是將需要展開的函數在函數定義的地方直接展開,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了,其后綴名一般為 .a
動態庫:
動態庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。所以動態庫也叫共享庫,動態庫一般后綴名為 .so
,如前面所述的 libc.so.6
就是動態庫,gcc
在編譯時默認使用動態庫
4.Linux自動化構建工具Makefile
make
是一條命令,makefile
是一個文件,兩個搭配使用,完成項目自動化構建
通常我們需要不斷的進行 gcc
/ g++
編譯、rm
刪除執行文件等等指令,如果有大量文件需要多次重復以上操作的話,那么每次都手動輸入一大長串必然是麻煩的,因此就需要編寫 Makefile
( makefile
也行,大小寫無所謂)文件自動化使用指令
如圖所示可解釋為:
processBar
可執行文件依賴于 processBar.c、main.c
,$^
表示 :
后面的文件,$@
表示 :
前面的文件,直接寫文件名也可以,不過用符號比較方便就是了,下面的 clean
同理,:
后面是空的表示不依賴于任何文件就可以執行
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar.c processBar.h[zzh_test@hcss-ecs-6aa4 progressbar]$ make processBar
gcc processBar.c main.c -o processBar
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar processBar.c processBar.h[zzh_test@hcss-ecs-6aa4 progressbar]$ make clean
rm -rf processBar
[zzh_test@hcss-ecs-6aa4 progressbar]$ ls
main.c makefile processBar.c processBar.h
通常使用 make+冒號前的依賴名
的方式執行自動化,如果只輸入 make
指令的話默認執行第一條自動化指令,被依賴的文件總會更新,所以要多次執行 make processBar
的指令
make
的默認行為是:基于時間戳判斷更新,檢查目標是否是一個已存在的文件,如果文件存在且沒有更新(即依賴項未變化),則跳過該目標的命令。像 clean
這種沒有具體依賴目標的叫做 偽目標
但有些場景下,目標并不是實際文件(比如常見的 clean
、all
、install
等),若目錄中恰好有與這些目標同名的文件(比如名為 clean
的文件),make
會誤將其當作 “已完成的目標文件”,認為無需執行,從而跳過本應運行的命令(如 rm -f *.o
),導致清理、構建等預期操作失敗
因此需要用 .PHONY
聲明偽目標 —— 強制 make
忽略同名文件,始終執行命令
🔥值得注意的是:
hello:hello.o
gcc hello.o -o hello hello.o:hello.s
gcc -c hello.s -o hello.o hello.s:hello.i
gcc -S hello.i -o hello.s hello.i:hello.c
gcc -E hello.c -o hello.i
make
會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件,在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么 make
就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make
根本不理,make
只管文件的依賴性,即如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起,我就不工作啦
5.Linux調試器gdb
Linux
系統中,程序的發布默認是 release
版本,無法直接發布,所以調試的前提是處于 debug
版本,那么在 gcc
/ g++
編譯時要加上 -g
使文件以 debug
版本輸出
gdb
是用來調試可執行文件或者目標文件的,所以用 gdb 目標文件
指令啟動調試器
以下是 gdb
代碼調試時的指令
一般我們還是在 VS
里調試比較方便,因此 gdb
的調試就不過多敘述