一、Linux軟件包管理 - yum
1、yum背景知識
(一)歷史沉淀
我們在安裝一個軟件之前,需要先下載對應(yīng)的軟件包,但是這個軟件包并不存在于我們本地的計算機(jī)磁盤,而是存在于遠(yuǎn)端服務(wù)器上;那么計算機(jī)如何知道該軟件存在于具體的哪一臺服務(wù)器上呢?
對于電腦來說,我們一般通過搜索對應(yīng)軟件的官網(wǎng)來得到相應(yīng)軟件包;對于手機(jī)來說,表面上我們通過手機(jī)自帶的應(yīng)用商店來下載軟件包,但實際上應(yīng)用商店里面并不存在軟件包,而只是存在著對應(yīng)軟件官網(wǎng)的鏈接,最后我們的軟件包還是從官網(wǎng)上下載的;
其次,這些軟件包是由誰提供的呢?答案很明顯,它們是由一些企業(yè)、組織或個人提供的;這些企業(yè)、組織以及個人為了某種利益編寫出了軟件包,然后將其放在了對應(yīng)的服務(wù)器上。
yum (Yellow dog Updater, Modified) 是Linux下非常常用的一種包管理器;主要應(yīng)用在 Fedora, RedHat,Centos 等發(fā)行版上;軟件包和軟件包管理器, 就好比 “App” 和 “應(yīng)用商店” 這樣的關(guān)系。
(二)認(rèn)識yum
在Linux下安裝軟件的方法大概有以下三種:
1)下載到程序的源代碼,自行進(jìn)行編譯,得到可執(zhí)行程序。
2)獲取rpm安裝包,通過rpm命令進(jìn)行安裝。(未解決軟件的依賴關(guān)系)
3)通過yum進(jìn)行安裝軟件。(常用)
注意:一個服務(wù)器同一時刻只允許一個yum進(jìn)行安裝,不能在同一時刻同時安裝多個軟件。?
(三)yum軟件本土化
我國的一些高校以及公司就 鏡像了國外的軟件服務(wù),即把國外服務(wù)器上的軟件拷貝到了國內(nèi)自己公司的服務(wù)器上,使得我們可以直接訪問國內(nèi)的服務(wù)器來下載軟件;
但是只拷貝軟件還不行,因為 yum 中下載軟件時默認(rèn)訪問的鏈接還是國外的,所以這些高校/公司還提供了一套國內(nèi)的下載鏈接配置文件 – yum 源配置文件;
在Linux中,yum 源配置文件是存在于 /etc/yum.repos.d/ 目錄下的 CentOS-Base.repo 文件:
ll /etc/yum.repos.d/
?如果你使用的是云服務(wù)器,那么 yum 源一般都是配置好的,虛擬機(jī)的配置方法會更麻煩一點,而且還需要利用ping值檢查網(wǎng)絡(luò)是否處于連接狀態(tài)
2、yum三板斧基本使用
(一)查看軟件包
yum list
但是這樣出來的東西很多很雜?
我們可以通過 yum list 命令羅列出當(dāng)前一共有哪些軟件包;但由于包的數(shù)目非常之多, 所以我們一般使用 grep 命令來篩選出我們關(guān)注的包;如:
grep指令http://t.csdn.cn/g1aDI
yum list| grep 要搜索的內(nèi)容
?注意事項:
- 軟件包名稱構(gòu)成:主版本號.次版本號.源程序發(fā)行號-軟件包的發(fā)行號.主機(jī)平臺.cpu架構(gòu);
- “x86_64” 后綴表示64位系統(tǒng)的安裝包,“i686” 后綴表示32位系統(tǒng)安裝包,選擇包時要和系統(tǒng)匹配;
- “el7” 表示操作系統(tǒng)發(fā)行版的版本: “el7” 表示的是 centos7/redhat7,“el6” 表示 centos6/redhat6;
- 最后一列中 base 表示的是 “軟件源” 的名稱, 類似于 “小米應(yīng)用商店”, “華為應(yīng)用商店” 這樣的概念;
拓展:rzsz本地機(jī)器與云服務(wù)器之間的文件互傳
rz:上傳文件(其實Windows直接拖到xshell中也是可以的)
?
?sz:將xshell文件給到Linux 這個沒有辦法拖 因為Linux下的文件不像windows一樣,是可以找到實體的
(二)安裝軟件
指令:?sudo?yum?install(可以加-y)?軟件名?
(其中 -y 代表不詢問直接安裝)(sudo是因為只有root才可以裝)
?
?
安裝完畢?
sl命令不同于ls命令,sl命令是以動畫形式呈現(xiàn)小火車的趣味性命令,雖無實用價值,但亦可陶冶情操,愉悅心情。
有一些軟件并沒有被納入 Centos、Ubuntu、Kail等相關(guān)生態(tài)平臺的官方軟件集合中,如果我們想使用這些軟件,需要安裝?非官方軟件集合列表 – epel-realse
注意事項:
- 安裝軟件時由于需要向系統(tǒng)目錄中寫入內(nèi)容,一般需要 sudo 或者切到 root 賬戶下才能完成;
- yum安裝軟件只能一個裝完了再裝另一個;正在yum安裝一個軟件的過程中,如果再嘗試用yum安裝另外一個軟件,yum會報錯;
- 軟件和軟件之間是有關(guān)聯(lián)的,即具有一定的耦合度; yum 為了解決軟件之間相互依賴的問題,有時候在安裝一個軟件會連帶安裝其他一些軟件。
(三)卸載軟件
指令:?sudo?yum?remove -y?軟件名
注意:關(guān)于 yum 的所有操作必須保證主機(jī) (虛擬機(jī)) 網(wǎng)絡(luò)暢通;可以通過 ping 指令驗證網(wǎng)絡(luò)
ping + 網(wǎng)站名字 就可以查看現(xiàn)在網(wǎng)絡(luò)是否健康
由于我將我的Linux配置成了 ctrl+c 是復(fù)制 ,那么也就是說?
ctrl+shift+c 就是強(qiáng)制退出執(zhí)行程序的代碼
?二、Linux編輯器 - vim(別用root配置)
為什么別用root配置 請看第5點
1、vim的基本概念
vim 是一個編輯器 和windows下的記事本沒有任何區(qū)別
這個編輯器有一個好處 是一個功能強(qiáng)大 多模式的編輯器?
vim 一共有12種模式,我們目前掌握其中三種模式即可,分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區(qū)分如下:
- 正常/普通/命令模式 (Normal mode)
存在的意義:通過各種各樣的命令,來簡化操作,加快使用效率
控制屏幕光標(biāo)的移動,字符、字或行的刪除;
移動復(fù)制某區(qū)段以及進(jìn)入Insert mode下,或者到 last line mode;
- 插入模式 (Insert mode)
只有在Insert mode下,才可以做文字輸入;
按「ESC」鍵可回到命令行模式,該模式是我們后面用的最頻繁的編輯模式;
- 底行模式 (last line mode)
文件保存或退出,也可以進(jìn)行文件替換,找字符串,列出行號等操作;
在命令模式下,輸入 : 即可進(jìn)入該模式;
我們可以在底行模式下輸入 “ :help vim-modes” 來查看 vim 的所有模式。
2、vim模式下的切換
我們使用 vim 打開一個文件時默認(rèn)處于命令模式,然后我們可以通過如下指令切換到其他模式:
vim test.c (后面寫的是 touch的文件名字)
?打開是黑黑的這個 這個就是命令模式
【命令模式】切換至【插入模式】
- 輸入「i」:在當(dāng)前光標(biāo)處進(jìn)入插入模式(我一般用i insert 多好記 但是也別忘了別的)
- 輸入「a」:在當(dāng)前光標(biāo)的后一位置進(jìn)入插入模式
- 輸入「o」:在當(dāng)前光標(biāo)處新起一行進(jìn)入插入模式
按完之后,左下角就是insert了
【命令模式】切換至【底行模式】
- 輸入「Shift+;」即可,實際上就是輸入「:」
左下角變成這樣,那么就是底行模式?
【插入模式】或【底行模式】切換至【命令模式】
- 插入模式或是底行模式切換至命令模式都是直接按一下「Esc」鍵即可
?3、vim命令模式各命令匯總
(一)移動光標(biāo)
- $ :?將光標(biāo)移動到行尾;
- ^ :將光標(biāo)移動到行首;
- G :?將光標(biāo)移動到文件末尾;
- gg :?將光標(biāo)移動到文件開頭;
- n + G :?將光標(biāo)移動到第 n 行;
- h j k l :將光標(biāo)向 左 下 上 右 移動;j:jump 向下跳 k:king 皇帝至高無上
(二)復(fù)制粘貼
- yy :復(fù)制當(dāng)前行 (nyy:從當(dāng)前行開始向下復(fù)制n行);
- p :粘貼一次 (np:粘貼n次);
(三)撤銷操作
- u :?撤銷操作 (后退一步);
- ctrl + r:取消撤銷操作 (前進(jìn)一步);
(四)剪切
- dd :?刪除當(dāng)前行 (ndd:從當(dāng)前行開始向下刪除n行);
- ndd:剪切光標(biāo)所在行開始往下的n行
- p:將已剪切的內(nèi)容在光標(biāo)的下一行粘貼上
- np:將已剪切的內(nèi)容在光標(biāo)的下一行粘貼n次
小羊注:vim 下的所有刪除操作都相當(dāng)于 Windows 下的剪切操作
(四)大小寫切換
- ~ :?切換光標(biāo)所在字符的大小寫 (可點按,按一個切換一個)
- n~:完成光標(biāo)所在位置開始往后的n個字符的大小寫切換
(五)替換
- rx :?將光標(biāo)所在字符替換為x字符 (nrx:將光標(biāo)所在字符開始往后的n個字符都替換為x字符);
- R :?批量化替換,即切換為替換模式,用鍵盤輸入的字符替換光標(biāo)所在字符,且替換之后光標(biāo)自動后移,等待替換下一個字符;我們最后需要輸入 [Esc] 從替換模式切回命令模式;
(六)更改
- w :將光標(biāo)跳轉(zhuǎn)到下一個字的第一個字符處 (nw:將光標(biāo)跳轉(zhuǎn)到下n個字的第一個字符處);
- cw :更改光標(biāo)所在處的字到字尾處,和 R 一樣,此命令會讓我們跳轉(zhuǎn)到插入模式
- cnw:更改n個字;
?(七)刪除
- x :?刪除光標(biāo)所在字符 (nx:刪除光標(biāo)所在字符開始往后的n個字符);
- X :刪除光標(biāo)所在字符的前一個字符 (nX:刪除刪除光標(biāo)所在字符的前n個字符);
- dd :?刪除當(dāng)前行 (ndd:從當(dāng)前行開始向下刪除n行);
(八)翻頁
- Ctrl+b:上翻一頁
- Ctrl+f:下翻一頁
- Ctrl+u:上翻半頁
- Ctrl+d:下翻半頁
4、vim底行模式各命令匯總
小羊注:在使用底行模式之前,記住先按「Esc」鍵確定你已經(jīng)處于命令模式,再按「:」即可進(jìn)入底行模式
(一)行號設(shè)置
- set?nu:顯示行號
- set?nonu:取消行號
(二)保存退出
- w:保存文件。
- q:退出vim,如果無法離開vim,可在「q」后面跟一個「!」表示強(qiáng)制退出。
- wq:保存退出
(三)分屏指令
- vs?文件名:實現(xiàn)多文件的編輯。
- Ctrl+w+w:光標(biāo)在多屏幕下進(jìn)行切換。
(四)執(zhí)行指令
- !+指令:在不退出vim的情況下,可以在指令前面加上「!」就可以執(zhí)行Linux的指令,例如查看目錄、編譯當(dāng)前代碼等。
將來提權(quán)sudo的時候 會用到!
5、vim的簡單及一鍵配置
?在目錄 /etc/ 下面,我們可以找到有一個名為?vimrc?的文件,這是系統(tǒng)中公共的vim配置文件,對所有用戶都有效
所以我們要對 vim 進(jìn)行一些其他的基本配置,使得我們能夠在便捷的在vim中編寫C/C++程序;特別注意:
雖然Linux中的所有用戶使用的都是同一個vim程序,但是大家使用的是不同的vim配置,因為每個用戶的家目錄下都會有一個屬于自己的 .vimrc 文件,這個文件中保存的就是專屬于這個用戶的 vim 配置。所以我在vim的基本使用上面寫別用root,以免將來配置出現(xiàn)問題。
一些簡單的vim配置:
- 設(shè)置語法高亮: syntax on;
- 顯示行號: set nu;
- 設(shè)置縮進(jìn)的空格數(shù)為4: set shiftwidth=4;
先用vim進(jìn)入.vimrc
之后檢查發(fā)現(xiàn)已經(jīng)全部寫好
但是有沒有一鍵配置的方法?? 答案是有的
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
大家復(fù)制這個到xshell 并且執(zhí)行 下面我和大家一起配置:
接著我們輸入root密碼:
?然后我們輸入 “source ~/.bashrc” 或者重啟終端即可使 vim 配置失效:
可以看到,配置完成后的 vim 不僅會顯示當(dāng)前模式、文件名、字符個數(shù),還支持自動縮進(jìn)、自動補齊 (語法、括號、引號等等)
?但是這里存在一個小問題:此處的自動縮進(jìn)默認(rèn)是兩個字符,而我們編寫C/C++程序時一般都要求縮進(jìn)四個字符,所以我們需要打開 .vimrc 文件對默認(rèn)縮進(jìn)進(jìn)行修改:
?
?至此,我們的 vim 一鍵配置就完成了!?。。。?歡呼?。。?/p>
文章來源地址http://www.zghlxwxcb.cn/news/detail-639224.html
?6、sudo提權(quán)
我們往往用su 或者 su- 來讓我們變成root執(zhí)行yum等等只有root才可以執(zhí)行的命令
但是我們在提權(quán)的時候,我們的身份通過whoami查詢后變成了root
sudo就是一個可以不改變身份但擁有root權(quán)力的短暫提權(quán)指令,但是往往都需要配置,這是不配置的情況:
那么這個時候就需要用vim打開文件進(jìn)行配置了
vim(空格)/etc/sudoers
?注意vim后面要加空格
?在這波操作中注意事項:
1. xiao_yang并不在受信任的用戶里面,所以得添加
2.因為是只讀文件,這個時候感嘆號就派上用場了,我先保存,之后再強(qiáng)制退出
現(xiàn)在,我們就可以在普通用戶下使用 sudo 對指令進(jìn)行提權(quán)了:
這個時候在配置完之后很容易發(fā)現(xiàn),就成功可以提權(quán)啦!!?
三、Linux編譯器 -?gcc/g++
1、gcc/g++的作用
gcc和g++分別是GNU的C和C++的編譯器,gcc和g++在執(zhí)行編譯的時候一般有以下四個步驟:
1)預(yù)處理(頭文件展開、去注釋、宏替換、條件編譯)。
2)編譯(C代碼翻譯成匯編語言)。
3)匯編(匯編代碼轉(zhuǎn)為二進(jìn)制目標(biāo)代碼)。
4)鏈接(將匯編過程產(chǎn)生的二進(jìn)制代碼進(jìn)行鏈接)。
2、gcc/g++語法
語法:?gcc/g++?選項?文件
常用選項:
-E 只進(jìn)行預(yù)處理,這個不生成文件,你需要把他重定向到一個輸出文件里面(否則將把預(yù)處理后的結(jié)果打印到屏幕上,我們gcc -E 又加-o 就是因為全部寫在屏幕上雜亂無章)
-S 編譯到匯編語言,不進(jìn)行匯編和鏈接,即只進(jìn)行預(yù)處理和編譯。(照樣不生成文件,也是打印在屏幕上的)
-c 編譯到目標(biāo)代碼
-o 將處理結(jié)果輸出到指定文件,該選項后需緊跟輸出文件名。(也就是有生成文件的能力)
-static 此選項對生成的文件采用靜態(tài)鏈接。
-g 生成調(diào)試信息(若不攜帶該選項則默認(rèn)生成release版本)。
-shared 此選項將盡量使用動態(tài)庫,生成文件較小。
-w 不生成任何警告信息。
Wall 生成所有警告信息。
-O0/-O1/-O2/-O3 編譯器優(yōu)化選項的四個級別,-O0表示沒有優(yōu)化,-O1為缺省值,-O3優(yōu)化級別最高。
gcc/g++ 的安裝:(大概率是都已經(jīng)安裝好了 latest)
sudo yum install -y gcc
yum install -y gcc-c++ libstdc++-devel
3、執(zhí)行編譯的四個步驟(Esc生成iso)
(一)預(yù)處理
gcc -E test.c -o test.i
- 預(yù)處理功能主要包括頭文件展開、去注釋、宏替換、條件編譯等。
- 預(yù)處理指令是以#開頭的代碼行。
- -E選項的作用是讓gcc/g++在預(yù)處理結(jié)束后停止編譯過程。
- -o選項是指目標(biāo)文件,“xxx.i”文件為已經(jīng)過預(yù)處理的原始程序。
現(xiàn)在,我們在底行模式中 vs test.c 就可以同時看到倆個文件
?(二)編譯
gcc -s test.i -o test.s
- 在這個階段中,gcc/g++首先檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,將代碼翻譯成匯編語言。
- 用戶可以使用-s選項來進(jìn)行查看,該選項只進(jìn)行編譯而不進(jìn)行匯編,生成匯編代碼。
- -o選項是指翻譯到XXX文件,“xxx.s”文件為已經(jīng)過翻譯的原始程序。
?
?(三)匯編
gcc -c test.s -o test.o
- 匯編階段是把編譯階段生成的“xxx.s”文件轉(zhuǎn)成目標(biāo)文件
- 使用-c選項就可以得到匯編代碼轉(zhuǎn)化為“xxx.o”的二進(jìn)制目標(biāo)代碼了
(四)鏈接(不是連接)
gcc test.o -o test
- 在成功完成以上步驟之后,就進(jìn)入了鏈接階段。
- 鏈接的主要任務(wù)就是將生成的各個“xxx.o”文件進(jìn)行鏈接,生成可執(zhí)行文件。
- gcc/g++不帶-E、-S、-c選項時,就默認(rèn)生成預(yù)處理、編譯、匯編、鏈接全過程后的文件。
- 若不用-o選項指定生成文件的文件名,則默認(rèn)生成的可執(zhí)行文件名為a.out。
?注意:?鏈接后生成的也是二進(jìn)制文件。
(五)一步到位
4、鏈接方式與函數(shù)庫
(一)動態(tài)鏈接(去網(wǎng)吧)和靜態(tài)鏈接(家里有筆記本玩)
我們在編寫代碼的時候,除了自己實現(xiàn)函數(shù)之外,我們還會去調(diào)用函數(shù)庫中的代碼,比如 scanf/printf/malloc/fopen;但是我們要明白,庫中的代碼是別人給我們寫好供我們直接使用的,即我們只有該函數(shù)的調(diào)用,而沒有函數(shù)的實現(xiàn);
同時,程序在預(yù)處理、編譯和匯編階段處理的都是我們自己編寫的代碼,只有在鏈接的時候,庫函數(shù)的實現(xiàn)才會和我們的代碼關(guān)聯(lián)起來 (符號表的重定位);所以,鏈接的本質(zhì)是我們在調(diào)用庫函數(shù)時如何與標(biāo)準(zhǔn)庫相關(guān)聯(lián)的問題
程序一共有兩種鏈接方式:動態(tài)鏈接與靜態(tài)鏈接
動態(tài)鏈接:是指執(zhí)行代碼時,如果遇到庫函數(shù)調(diào)用就跳轉(zhuǎn)到動態(tài)庫中對應(yīng)函數(shù)的定義處,然后執(zhí)行該函數(shù),執(zhí)行完畢后再跳轉(zhuǎn)回原程序并繼續(xù)往下執(zhí)行
優(yōu)點:是形成的可執(zhí)行程序小
缺點:是受到動態(tài)庫變動 (刪除、升級等) 的影響。
靜態(tài)鏈接:直接將本程序內(nèi)部要使用的庫函數(shù)從對應(yīng)的靜態(tài)庫中拷貝一份過來
優(yōu)點:不與靜態(tài)庫產(chǎn)生關(guān)聯(lián),即不受靜態(tài)庫變動 (刪除、升級等) 的影響
缺點:形成的可執(zhí)行程序非常大
(二)動態(tài)庫與靜態(tài)庫
函數(shù)庫是一些事先寫好的,用于給別人復(fù)用的函數(shù)的集合,函數(shù)庫一般分為靜態(tài)庫和動態(tài)庫兩種:
靜態(tài)庫是指編譯鏈接時,把需要的庫文件代碼全部拷貝到可執(zhí)行文件中,因此生成的文件非常大,但在運行時也就不再需要庫文件了
在Linux下其后綴名為 “.a”,在Windows下其后綴名為 “.lib”;
動態(tài)庫也被稱為共享庫,它與靜態(tài)庫相反,在編譯鏈接時并沒有把相應(yīng)的庫文件代碼加入到可執(zhí)行文件中,而是在程序執(zhí)行時由運行時鏈接文件來加載庫,這樣可以節(jié)省系統(tǒng)的開銷,在Linux下其后綴名為 “.so”,在Windows下其后綴名為 “.dll”;
注:動態(tài)鏈接必須使用動態(tài)庫,靜態(tài)鏈接必須使用靜態(tài)庫;即進(jìn)行動態(tài)鏈接時只能跳轉(zhuǎn)到動態(tài)庫中對應(yīng)函數(shù)的實現(xiàn)處,進(jìn)行靜態(tài)鏈接時只能拷貝靜態(tài)庫中的函數(shù)。
(三)動態(tài)鏈接(默認(rèn))與靜態(tài)鏈接(-static)
Linux中默認(rèn)使用動態(tài)庫進(jìn)行動態(tài)鏈接:gcc默認(rèn)生成的二進(jìn)制程序,是動態(tài)鏈接的,這點可以通過 file 指令來驗證
原因如下:
- 程序形成的可執(zhí)行程序大不僅僅是占用的磁盤空間大,其被運行時加載到內(nèi)存所占用的內(nèi)存空間也會非常大,而目前我們使用的機(jī)器的內(nèi)存基本上都是8/16GB的,所以運行不了過大的可執(zhí)行程序(靜態(tài)程序大)
- 雖然動態(tài)鏈接受函數(shù)庫變動的影響,但是函數(shù)庫一般很少會變動,即使變動也必須兼容以前的版本,所以影響不大(即使我去網(wǎng)吧,網(wǎng)吧影響我的情況很少,除非倒閉等等)
?Linux 一般都會自動安裝C語言動態(tài)庫,因為Linux下的大多數(shù)指令以及我們默認(rèn)使用 gcc 編譯得到的可執(zhí)行程序都是進(jìn)行動態(tài)鏈接,依賴C動態(tài)庫的
但是C靜態(tài)庫、C++靜態(tài)庫可能就需要我們自己安裝了
sudo yum install -y glibc-static
sudo yum install -y libstdc++-static
?雖然gcc和g++默認(rèn)采用的是動態(tài)鏈接,但如果我們需要使用靜態(tài)鏈接,帶上-static選項即可
gcc test.c -o test.s -static
?可以看到,以靜態(tài)鏈接方式形成的可執(zhí)行程序比動態(tài)鏈接形成的要大100~200倍,即一個動態(tài)鏈接只有100M的文件,靜態(tài)鏈接就會變成十幾個G,二者之間相差非常大
四、Linux調(diào)試器 - gdb的使用
1、debug 與 release
?1、debug版本:程序本身會被加入更多的調(diào)試信息,以便于進(jìn)行調(diào)試。
?2、release版本:不會添加任何調(diào)試信息,是不可調(diào)試的。
在Linux當(dāng)中g(shù)cc/g++默認(rèn)生成的可執(zhí)行程序是release版本的,是不可被調(diào)試的。如果想生成debug版本,就需要在使用gcc/g++生成可執(zhí)行程序時加上-g選項
?對同一份源代碼分別生成其release版本和debug版本的可執(zhí)行程序,并通過ll指令可以看到,debug版本發(fā)布的可執(zhí)行程序的大小比release版本發(fā)布的可執(zhí)行程序的大小要大一點,其原因就是以debug版本發(fā)布的可執(zhí)行程序當(dāng)中包含了更多的調(diào)試信息
2、gdb命令匯總
(一)進(jìn)入gdb
指令: gdb?文件名
(二)調(diào)試
- run/r:運行代碼(啟動調(diào)試)。
- next/n:逐過程調(diào)試:不進(jìn)入函數(shù),從n行直接到n+1行,F(xiàn)10
- step/s:逐語句調(diào)試:進(jìn)入函數(shù):F11
- until?行號:跳轉(zhuǎn)至指定行。
- finish:執(zhí)行完當(dāng)前正在調(diào)用的函數(shù)后停下來(不能是主函數(shù)),可以很快的檢查該函數(shù)是不是出現(xiàn)代碼問題
- continue/c:運行到下一個斷點處:F5
- set?var?變量=x:修改變量的值為x。
(三)顯示
- list/l?n:顯示從第n行開始的源代碼,每次顯示10行,若n未給出則默認(rèn)從上次的位置往下顯示.。
- list/l?函數(shù)名:顯示該函數(shù)的源代碼。
- print/p?變量:打印變量的值。
- print/p?&變量:打印變量的地址。
- print/p?表達(dá)式:打印表達(dá)式的值,通過表達(dá)式可以修改變量的值。
- display?變量:相當(dāng)于監(jiān)視窗口,加入常顯示
- display?&變量:將變量的地址加入常顯示。
- undisplay?編號:取消指定編號變量的常顯示。
- bt:查看各級函數(shù)調(diào)用及參數(shù),查看調(diào)用堆棧
- info/i?locals:查看當(dāng)前棧幀當(dāng)中局部變量的值。
(四)斷點
添加斷點 和 刪除斷點是不一樣的操作,添加直接行號 但是刪除的時候 斷點擁有自己的序號了已經(jīng) 從0123開始
- break/b?n:在第n行設(shè)置斷點。
- break/b?函數(shù)名:在某函數(shù)體內(nèi)第一行設(shè)置斷點。
- info?breakpoint/b:查看已打斷點信息。
- delete/d?編號:刪除指定編號的斷點。
- disable?編號:關(guān)掉斷點的使能(目的是為了保留斷點痕跡,斷點存在但不起作用)
- enable?編號:啟用指定編號的斷點。
(五)退出gdb
- quit/q:退出gdb。
?五、Linux項目自動化創(chuàng)建工具 - make/makefile的使用
1、make/Makefile的重要性
- 會不會寫Makefile,從側(cè)面說明了一個人是否具備完成大型工程的能力
- 一個工程的源文件不計其數(shù),按照其類型、功能、模塊分別放在若干個目錄當(dāng)中,Makefile定義了一系列的規(guī)則來指定:哪些文件需要先編譯,哪些文件需要后編譯,甚至于進(jìn)行更復(fù)雜的功能操作
- Makefile帶來的好處就是“自動化編譯”,一旦寫好,只需一個make命令,整個工程完全自動編譯,極大的提高了軟件開發(fā)的效率
- mak是一個命令工具,是一個解釋Makefile當(dāng)中指令的命令工具,一般來說,大多數(shù)的IDE都有這個命令,例如:Delphi的make,Visual
- C++的nmake,Linux下GNU的make。可見,Makefile都成為了一種在工程方面的編譯方法。
- make是一條命令,Makefile是一個文件,兩個搭配使用,完成項目自動化構(gòu)建
2、如何編寫makefile(依賴關(guān)系很重要)
編寫 makefile,最重要的是編寫?依賴關(guān)系和依賴方法
當(dāng)我們和老爸要錢的時候:依賴關(guān)系:我是你兒子;方法:打電話
依賴關(guān)系:指一個文件依賴另外一個文件,即想要得到一個文件,目錄下必須先有另外一個文件
例如,test.o文件是由test.c文件通過預(yù)處理、編譯以及匯編之后生成的文件,所以test.c文件的改變會影響test.o,所以說test.o文件依賴于test.c文件
依賴方法:則是指如何根據(jù)依賴文件來得到目標(biāo)文件
例如,test.o依賴于test.c,而test.c通過gcc -c test.c -o
test.o指令就可以得到test.o,那么test.o依賴于test.c的依賴方法就是gcc -c test.c -o test.o
編寫mkfile的時候,也有一些需要注意的地方,小羊注:
- makefile 的文件名必須是 makefile/Makefile,不能是其他名稱,否則 make 識別不了;
- 依賴文件可以有多個,也可以沒有;
- 依賴方法必須以 [Tab] 鍵開頭,特別注意不能是四個空格;
步驟一:?在源文件所在目錄下創(chuàng)建一個名為Makefile/makefile的文件
?步驟二:編寫Makefile文件 (vim Makefile)
Makefile文件最簡單的編寫格式是,先寫出文件的依賴關(guān)系,然后寫出這些文件之間的依賴方法,依次寫下去
?如上:mytest依賴 test.c,依賴方法是 gcc 編譯,clean 不依賴任何文件,依賴方法是 rm -f 指令;其中 .PHONY 修飾 clean 表示其是一個偽目標(biāo),總是被執(zhí)行 (具體細(xì)節(jié)下文解釋)
?編寫完畢Makefile文件后保存退出:wq,然后在命令行當(dāng)中執(zhí)行make指令便可以生成可執(zhí)行程序,以及該過程產(chǎn)生的中間產(chǎn)物
3、make的工作原理
單純對例子的粗略解釋:
mytest: test.c
? ? gcc test.c -o mytest
這個規(guī)則告訴 Make 工具如何構(gòu)建目標(biāo) `mytest`。它表示 `mytest` 依賴于 `test.c` 這個文件。如果 `test.c` 文件的修改時間比 `mytest` 更新(或者 `mytest` 不存在),那么 Make 會執(zhí)行接下來的命令來構(gòu)建 `mytest`。
.PHONY: clean
clean:
? ? rm -f mytest
這個規(guī)則定義了一個偽目標(biāo) `.PHONY` 和一個目標(biāo) `clean`。`.PHONY` 用于聲明 `clean` 是一個偽目標(biāo),即不是真正的文件。`clean` 目標(biāo)用于清理構(gòu)建生成的中間文件和目標(biāo)文件,以及最終生成的可執(zhí)行文件 `mytest`。執(zhí)行 `make clean` 命令時,Make 會執(zhí)行 `clean` 目標(biāo)的命令,即刪除名為 `mytest` 的文件。單純寫make的時候不會執(zhí)行clean
工作流程:
1. 當(dāng)你執(zhí)行 `make` 命令時,Make 工具會尋找當(dāng)前目錄下的 `Makefile` 文件。
2. Make 讀取 `Makefile` 中的規(guī)則,并檢查目標(biāo) `mytest` 是否需要重新構(gòu)建。它發(fā)現(xiàn)目標(biāo) `mytest` 依賴于 `test.c`,并且 `test.c` 存在或者其修改時間較 `mytest` 更新,所以 `mytest` 需要重新構(gòu)建。
3. Make 執(zhí)行 `gcc test.c -o mytest` 命令來編譯 `test.c` 并生成可執(zhí)行文件 `mytest`。
4. 如果你執(zhí)行 `make clean` 命令,Make 工具會執(zhí)行 `clean` 目標(biāo)的命令,即刪除 `mytest` 文件。
`Makefile` 文件的目的是讓構(gòu)建過程自動化和簡化。通過定義適當(dāng)?shù)囊?guī)則和依賴關(guān)系,Make 工具可以只編譯需要更新的文件,從而加快構(gòu)建過程,并確保項目的正確性和一致性。
(一)make的使用
在Linux下,我們輸入 make 命令后,make 會在當(dāng)前目錄下找尋名為 “Makefile” 或 “makefile” 的文件;如果找到,它會把文件中的第一個目標(biāo)文件作為最終的目標(biāo)文件;如果找不到,就打印提示信息;在上面的C語言例子中,makefile 中一共有兩個目標(biāo)文件
沒有生成clean,雖然clean也是目標(biāo)文件:
這樣就可以執(zhí)行倆段代碼:
?
?(二)make的依賴性
修改一下makefile文件:
test.out:test.o
gcc test.o -o test.out
test.o:test.s
gcc -c test.c -o test.o
test.s:test.i
gcc -S test.i -o test.s
test.i:test.c
gcc -E test.c -o test.i
.PHONY:clean
clean:
rm -f test.i test.s test.o test.out
我們知道,我們輸入 make 命令后,make 會在當(dāng)前目錄下找尋名為 “Makefile” 或 “makefile” 的文件;如果找到,它會把文件中的第一個目標(biāo)文件作為最終的目標(biāo)文件 (上面例子中的 test.out),但是如果 test.out 所依賴的 test.o 文件不存在,那么 make 會在當(dāng)前文件中找目標(biāo)為 test.o 文件的依賴性,再根據(jù)該一個規(guī)則來生成 test.o 文件 (類似于數(shù)據(jù)結(jié)構(gòu)棧 – 后進(jìn)先出);
如果 test.o 的依賴文件也不存在,則繼續(xù)執(zhí)行該規(guī)則,直到找到存在依賴文件的目標(biāo)文件,得到目標(biāo)文件后層層返回形成路徑上的其他目標(biāo)文件;或者最后被依賴的文件找不到,直接退出并報錯;
這就是整個 make 的依賴性,make 會一層又一層地去找文件的依賴關(guān)系,直到最終編譯出最開始我們需要的目標(biāo)文件。
在上面的例子中,test.out 依賴的 test.o 不存在,make 會去尋找以 test.o 為目標(biāo)文件的依賴關(guān)系;test.o 依賴的 test.s 也不存在,make 又會去找 以 test.s 為目標(biāo)文件的依賴關(guān)系;然后 test.s 依賴 test.i,最后,test.i 的依賴文件 test.c 終于存在了,make 就會根據(jù) test.i 的依賴方法形成 test.i,再逐步形成 test.s、test.o,直到最后形成 test.out。
?(三)項目清理
在 makefile 中,我們常用 clean 來作為項目清理的目標(biāo)文件,同時,由于項目清理不需要依賴其他文件,所以 clean 也不存在依賴關(guān)系
clean 沒有被第一個目標(biāo)文件直接或間接關(guān)聯(lián),那么它后面所定義的命令將不會被自動執(zhí)行,所以我們需要顯示指定 :?make clean
?最后,像 clean 這種目標(biāo)文件,我們一般都會用 .PHONY 將其設(shè)置為偽目標(biāo),
偽目標(biāo)的特性是:
該目標(biāo)文件總是被執(zhí)行
(四).PHONY偽目標(biāo)
當(dāng)我們對同一個源文件多次 make,我們會發(fā)現(xiàn)第一次程序正常編譯,但第二次及以后就不再編譯,而是提示:“make: `test.out’ is up to date.”
但是當(dāng)我們把 test.c 中的內(nèi)容修改過后,我們發(fā)現(xiàn)盡管可以再次 make 了,但是仍然不能多次 make
實際上,上面這種現(xiàn)象是 make 為了防止我們對已經(jīng)編譯好且未做修改的源文件重復(fù)編譯而浪費時間(不要認(rèn)為編譯時間很短);也就是說,如果 test.c 已經(jīng)編譯得到了 test.out,并且我們并沒有對 test.c 做改動,那么我們再次 make 時 make 不會被執(zhí)行;實際上 make 這樣做是很有必要的,因為在工作中,編譯一個工程往往需要幾十分鐘甚至幾個小時,如果我們 make 每次都重新編譯,勢必會浪費很多時間。
那么 make 是如何判斷源程序不需要重新編譯的呢?答案是根據(jù)文件的修改時間 (modify time) 來判定。
在Linux中,文件一共有三種時間:stat + 文件名字
訪問時間 (Access):當(dāng)我們查看文件內(nèi)容后該時間改變,比如 cat、vim、less;
修改時間 (Modify):當(dāng)我們修改文件內(nèi)容后改時間改變,比如 nano、vim;
改動時間 (Change):當(dāng)我們修改文件屬性或權(quán)限后改時間改變,比如 nano/vim (文件大小改變),chmod/chown/chown (文件權(quán)限改變);
make 則是根據(jù)可執(zhí)行程序的修改時間 (modify time) 與源文件的修改時間的對比來判斷源程序是否需要重新編譯
注:make 判斷源文件是否需要重新編譯只與源文件的修改時間變動有關(guān),與源文件的內(nèi)容改動無關(guān),我們可以通過 touch 命令來驗證:(touch file:如果 file 已存在,則更新 file 的所有時間)
但是這里touch不是Makefile生成的文件 而是冒號后面的文件 被依賴的文件
所以說:.PHONY 的作用其實和touch很類似,就是修改文件時間,從而使得程序被執(zhí)行
?我們也可以使用 .PHONY 來修飾 test.out,使得 test.out 每次都被重新編譯
?
完結(jié)撒花! Linux工具的基本使用到這里告一段落,希望大家多多指點?。?!文章來源:http://www.zghlxwxcb.cn/news/detail-639224.html
到了這里,關(guān)于【Linux】vim(附配置sudo)、yum、gcc、g++、gdb、make/Makefile工具匯總的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!