第05章-Linux編程環(huán)境自考成人專科本科課件_第1頁
第05章-Linux編程環(huán)境自考成人??票究普n件_第2頁
第05章-Linux編程環(huán)境自考成人專科本科課件_第3頁
第05章-Linux編程環(huán)境自考成人??票究普n件_第4頁
第05章-Linux編程環(huán)境自考成人專科本科課件_第5頁
已閱讀5頁,還剩84頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第5章 Linux編程環(huán)境文本編輯器VimGCC編譯器GDB調(diào)試器Make工程管理器文本編輯器VimGCC編譯器點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)GDB調(diào)試器點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu) 5.25.35.1點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu) Make工程管理器點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu) 5.4掌握掌握掌握掌握學(xué)習(xí)目標(biāo)掌握Vim編輯器的使用方法1掌握Make工程管理器的使用方法42掌握GCC編譯器的使用方法3掌握GDB調(diào)試器的使用方法對(duì)于程序開發(fā)者來說,熟練使用Linux操作系統(tǒng)開發(fā)工具是編程開發(fā)的前提,因此本章將針對(duì)Linux操作系統(tǒng)中常用的編程開發(fā)工具(文本編輯器、程序編譯器、調(diào)試器、Make工程管理器)分別進(jìn)行介紹。通過學(xué)

2、習(xí)環(huán)境配置和相關(guān)的使用技巧,讀者應(yīng)提升對(duì)原始操作系統(tǒng)的環(huán)境搭建能力,熟練使用操作系統(tǒng)工具進(jìn)行開發(fā)工作。5.1 文本編輯器Vim5.1.1文本編輯器簡介返回目錄5.1.2Vim的安裝與配置5.1.3Vim的工作模式5.1.4Vim按鍵說明5.1.1 文本編輯器簡介 5.1 文本編輯器Vim文本編輯器在操作系統(tǒng)中扮演著十分重要的角色,不論是配置系統(tǒng)文件還是編寫程序代碼,都需要借助于文本編輯器來完成。不同的操作系統(tǒng)中存在不同的文本編輯器,如TextMate(Mac操作系統(tǒng))、Notepad+(Windows操作系統(tǒng))等。雖然這些文本編輯器都是用來編輯文件的,但其內(nèi)部設(shè)計(jì)的細(xì)節(jié)不盡相同,因此也形成了各

3、自的特色。Linux操作系統(tǒng)中有許多非常優(yōu)秀的文本編輯器,按照其功能可以分為4類,分別為行編輯器、全屏編輯器、字符界面編輯器和圖形界面編輯器。(1)行編輯器:每次只能處理文本中的一行,使用較為不便。(2)全屏編輯器:可以實(shí)現(xiàn)對(duì)整個(gè)屏幕的編輯,用戶編輯的文件直接顯示在屏幕上,從而解決行編輯器的不直觀問題。5.1.1 文本編輯器簡介 5.1 文本編輯器Vim(3)字符界面編輯器:早期的編譯器,運(yùn)行在字符界面中,不支持鼠標(biāo)操作。由于現(xiàn)在的服務(wù)器都運(yùn)行在字符界面下,因此字符界面編輯器也十分重要。(4)圖形界面編輯器:操作方法與Windows操作系統(tǒng)中的記事本類似,同時(shí)提供了語法高亮顯示功能。大部分版本

4、的Ubuntu系統(tǒng)默認(rèn)安裝全屏編輯器Vim,以及圖形界面編輯器gedit。這兩種編輯器由于功能性強(qiáng),與用戶交互十分友好,因此使用較為普遍。gedit是一種在GNOME桌面環(huán)境下兼容UTF-8的文本編輯器,同時(shí)具有語法高亮和編輯多個(gè)文件的功能,為自由軟件。5.1.1 文本編輯器簡介 5.1 文本編輯器Vim圖形界面編輯器gedit打開文件的界面如圖所示。Vim是vi命令發(fā)展而成的一種文本編輯器,具有代碼補(bǔ)充、錯(cuò)誤跳轉(zhuǎn)等功能。Vim的設(shè)計(jì)理念是命令的組合。各種各樣的文本間移動(dòng)、跳轉(zhuǎn)命令與其他普通模式的編輯命令靈活地組合使用,更加高效地進(jìn)行文本編輯,因此這種編輯器被程序員廣泛使用。5.1.1 文本編

5、輯器簡介 5.1 文本編輯器Vim全屏編輯器Vim打開文件的界面如圖所示。5.1.2 Vim的安裝與配置 5.1 文本編輯器Vim1.Vim的安裝如果讀者使用的Ubuntu系統(tǒng)中沒有Vim編輯器,則需要自行安裝并配置。檢測、安裝Vim的過程示例代碼參考教材5.1.2節(jié)。例顯示的結(jié)果表示Vim編輯器安裝成功。此時(shí)的Vim編輯器已經(jīng)可以實(shí)現(xiàn)文本的編輯,但是由于缺少一些人性化的配置,其用戶體驗(yàn)不佳,因此需要對(duì)Vim編輯器進(jìn)行一些配置工作。5.1.2 Vim的安裝與配置 5.1 文本編輯器Vim2.Vim的配置未經(jīng)過配置的Vim編輯器使用不方便且不美觀。如圖所示,使用未經(jīng)過配置的Vim編輯器編寫一個(gè)C

6、語言程序代碼。Vim 的全局配置一般在文件“/etc/vim/vimrc”或者“/etc/vimrc”中,且對(duì)所有用戶生效。如果只是針對(duì)特定的用戶進(jìn)行個(gè)性配置,則選擇為文件“/.vimrc”(用戶主目錄下的隱藏文件.vimrc)進(jìn)行配置。5.1.2 Vim的安裝與配置 5.1 文本編輯器Vim本小節(jié)選擇文件“/.vimrc”進(jìn)行配置演示,需要聲明的是,配置文件內(nèi)容僅供參考。讀者如果直接復(fù)制使用可能會(huì)因?yàn)槲窗惭bVim相關(guān)插件而出現(xiàn)警告提示,此時(shí)只需要將提示出錯(cuò)的具體代碼行注釋掉即可,注釋代碼使用符號(hào)“”(英文雙引號(hào))即可。使用gedit打開新文件.vimrc(命令為gedit /.vimrc),

7、示例代碼參考教材5.1.2節(jié)。例為配置文件添加的內(nèi)容,讀者不必過多解讀,如需要個(gè)性定制可以根據(jù)自身需求在網(wǎng)絡(luò)中搜索Vim配置方案,參考優(yōu)秀示例進(jìn)行修改。Vim的一些配置依賴Vim的插件產(chǎn)生作用,這些插件一般保存在“/.vim”目錄中。5.1.2 Vim的安裝與配置 5.1 文本編輯器Vim讀者在使用網(wǎng)絡(luò)中其他程序開發(fā)者的.vimrc配置文件時(shí),如需要具體的Vim插件,可以選擇去其個(gè)人的github倉庫中下載,或者使用Vundle插件管理器進(jìn)行安裝。保存例中的配置文件,關(guān)閉終端,再重新打開終端,配置即可生效。圖所示為配置生效后編寫代碼的新效果,Vim自動(dòng)實(shí)現(xiàn)添加文件信息顯示,并且可以實(shí)現(xiàn)Tab鍵

8、自動(dòng)補(bǔ)齊。5.1.3 Vim的工作模式 5.1 文本編輯器VimVim的工作模式有3種,分別為命令模式、輸入模式、底行模式。1.命令模式當(dāng)使用命令vim打開文件,這個(gè)初始狀態(tài)就屬于命令模式。如例所示,打開文件README。在這種模式下,用戶可以使用按鍵移動(dòng)光標(biāo),完成文本的字符甚至整行的刪除、復(fù)制、粘貼等操作。此狀態(tài)下按鍵輸入會(huì)被Vim識(shí)別為命令,而非字符,打開文件進(jìn)入命令模式,如圖所示。5.1.3 Vim的工作模式 5.1 文本編輯器Vim2.插入模式在命令模式下,無法實(shí)現(xiàn)對(duì)文件的編輯操作,因此需要進(jìn)行模式切換。在命令模式下按下輸入i、I、o、O、a、A、r、R任意一個(gè)字母鍵即可進(jìn)入插入模式,

9、此時(shí)用戶對(duì)文件進(jìn)行操作可參考Windows記事本操作方法。如果需要切換回命令模式,按Esc鍵即可。Vim的插入模式如圖所示。5.1.3 Vim的工作模式 5.1 文本編輯器Vim3.底行模式在命令模式下,按快捷鍵“Shift + :”或“Shift + /”即可進(jìn)入底行模式。在此模式下,可以實(shí)現(xiàn)查找、存盤(保存文件)、替換字符、保存退出等一系列操作。Vim底行模式如圖所示。5.1.3 Vim的工作模式 5.1 文本編輯器Vim以上3種模式可以根據(jù)用戶的需求切換使用,切換的方式如圖所示。5.1.4 Vim模式按鍵說明 5.1 文本編輯器Vim命令模式下,用戶可根據(jù)情況靈活使用各種按鍵進(jìn)行文本的快

10、捷操作,其常用的按鍵及說明如表所示。5.1.4 Vim模式按鍵說明 5.1 文本編輯器Vim使用某些特定的字符按鍵即可將Vim從命令模式切換到輸入模式,其常用的按鍵及說明如表所示。5.1.4 Vim模式按鍵說明 5.1 文本編輯器Vim底行模式常用的按鍵及說明如表所示。5.2 GCC編譯器5.2.1GCC編譯器簡介返回目錄5.2.2GCC編譯流程5.2.3GCC編譯選項(xiàng)5.2.4GCC編譯器版本切換5.2.1 GCC編譯器簡介5.2 GCC編譯器GCC(GNU Compiler Collection)是一款編譯語言編譯器,此項(xiàng)目最早由GNU計(jì)劃的發(fā)起者理查德 斯托曼開始實(shí)施。第一版GCC于19

11、87年發(fā)行,最初的GCC代表GNU C Compiler,即GNU的C語言編譯器。后來經(jīng)過不斷地發(fā)展,GCC適應(yīng)了C+、Objective-C、Java、Go等更多編譯語言。GCC最重要的特點(diǎn)為實(shí)現(xiàn)跨硬件平臺(tái)編譯,即可在當(dāng)前的CPU平臺(tái)上為其他體系結(jié)構(gòu)的硬件平臺(tái)(ARM、MIPS、X86、PowerPC)開發(fā)軟件,目前這一方式被廣泛應(yīng)用于嵌入式開發(fā)中。GCC編譯器的工作目的就是將開發(fā)者編寫的語言代碼變成可以被機(jī)器識(shí)別的二進(jìn)制碼。一個(gè)完整的編譯器主要由以下4部分組成,它們可稱為編譯器的主要組件。5.2.1 GCC編譯器簡介5.2 GCC編譯器(1)分析器:將源程序代碼轉(zhuǎn)換為匯編語言。(2)匯編器

12、:將匯編語言的代碼轉(zhuǎn)換為CPU可以執(zhí)行的字節(jié)碼。(3)鏈接器:將匯編器生成的單獨(dú)的目標(biāo)文件組合成可執(zhí)行的應(yīng)用程序。(4)標(biāo)準(zhǔn)C庫:提供對(duì)核心函數(shù)的支持,如果應(yīng)用程序使用到C庫中的函數(shù),C庫就會(huì)通過鏈接器與源代碼連接,來生成最終的可執(zhí)行程序。5.2.1 GCC編譯器簡介5.2 GCC編譯器使用Vim編輯器編輯C語言代碼。5.2.1 GCC編譯器簡介5.2 GCC編譯器保存例中的文件,通過GCC編譯器進(jìn)行編譯,如例所示。例中,將C語言代碼文件test.c通過gcc命令執(zhí)行編譯,生成編譯后的執(zhí)行代碼a.out,執(zhí)行a.out得到程序的運(yùn)行結(jié)果。使用GCC編譯器編譯代碼時(shí),用戶可直接使用命令gcc,不

13、附加任何選項(xiàng),指定需要編譯的文件名即可。5.2.2 GCC編譯流程5.2 GCC編譯器例中的示例代碼(體積?。?,雖然編譯時(shí)間很短,但是從源代碼test.c到執(zhí)行代碼a.out,總共經(jīng)歷了4個(gè)編譯必不可少的步驟,分別是預(yù)處理(Pre-Processing)、編譯(Compiling)、匯編(Assembling)、鏈接(Linking)。如圖所示。5.2.2 GCC編譯流程5.2 GCC編譯器1.預(yù)處理在預(yù)處理階段GCC主要處理帶“#”的指令,如#include(頭文件)、#define(宏定義)等,并刪除注釋、添加行號(hào)和文件名標(biāo)識(shí)。例如,例中的代碼,在預(yù)處理的階段將把包含的頭文件stdio.h

14、添加進(jìn)來(解析頭文件),然后生成預(yù)處理文件test.i。預(yù)處理可以通過GCC編譯器單步編譯實(shí)現(xiàn),只需在命令gcc中添加選項(xiàng)“-E”即可。該選項(xiàng)的作用就是讓編譯器執(zhí)行完預(yù)處理后停止編譯過程。5.2.2 GCC編譯流程5.2 GCC編譯器如例所示,單步執(zhí)行編譯(只執(zhí)行預(yù)處理過程),生成預(yù)處理文件。其中“-o”表示指定生成的新文件的名稱。2.編譯編譯階段中,GCC對(duì)預(yù)處理文件進(jìn)行詞法分析、語法分析、語義分析,檢查代碼的規(guī)范性。確認(rèn)無誤后,GCC將代碼翻譯為匯編語言。同樣,編譯也可以使用GCC編譯器進(jìn)行單步操作。添加選項(xiàng)“-S”即可完成編譯操作,而不會(huì)繼續(xù)執(zhí)行匯編處理。5.2.2 GCC編譯流程5.2

15、 GCC編譯器例單步執(zhí)行編譯(只執(zhí)行編譯過程),生成匯編文件。由C語言代碼生成的匯編代碼參考教材5.2.2節(jié)。匯編代碼也是嵌入式開發(fā)的一部分,感興趣的讀者可以查詢匯編代碼中這些符號(hào)的意義。5.2.2 GCC編譯流程5.2 GCC編譯器3.匯編匯編階段匯編代碼轉(zhuǎn)換為機(jī)器可以執(zhí)行的指令。使用編譯器進(jìn)行單步操作,通過添加選項(xiàng)“-c”即可指定生成二進(jìn)制的目標(biāo)文件。例中生成二進(jìn)制目標(biāo)文件test.o。5.2.2 GCC編譯流程5.2 GCC編譯器4.鏈接鏈接是一個(gè)復(fù)雜的過程,包括符號(hào)地址確定、符號(hào)解析與重定位、指令修正等。鏈接階段有一項(xiàng)重要的工作,就是鏈接庫文件,程序代碼中經(jīng)常會(huì)出現(xiàn)一些函數(shù)接口的使用,

16、這些函數(shù)并不需要開發(fā)者自己實(shí)現(xiàn),其功能已經(jīng)被寫好并編譯到函數(shù)庫中,開發(fā)者只需要調(diào)用庫函數(shù)即可。函數(shù)庫分為靜態(tài)庫與動(dòng)態(tài)庫兩種。對(duì)靜態(tài)庫而言,編譯鏈接時(shí)會(huì)把庫文件代碼加載到執(zhí)行文件中,因此生成的文件體積較大,但運(yùn)行時(shí)不需要庫文件。動(dòng)態(tài)庫則剛好相反,在編譯鏈接時(shí)并不會(huì)將庫文件加載到執(zhí)行文件,而是在程序執(zhí)行時(shí)加載庫文件。5.2.2 GCC編譯流程5.2 GCC編譯器完成鏈接操作即可生成可執(zhí)行文件,如例所示。5.2.2 GCC編譯流程5.2 GCC編譯器當(dāng)需要獲取特定的編譯文件時(shí),可以考慮單步執(zhí)行編譯處理,也可以一次性執(zhí)行多個(gè)步驟,如例所示,將源程序代碼直接編譯生成二進(jìn)制的目標(biāo)文件,本次編譯經(jīng)歷預(yù)處理、

17、編譯、匯編3個(gè)階段。讀者也可以根據(jù)情況,靈活執(zhí)行編譯處理。5.2.3 GCC編譯選項(xiàng)5.2 GCC編譯器GCC有很多附加選項(xiàng)可以使用,包括總體選項(xiàng)、警告選項(xiàng)、優(yōu)化選項(xiàng)以及體系結(jié)構(gòu)相關(guān)選項(xiàng)。其中常用的附加選項(xiàng)如表所示。5.2.3 GCC編譯選項(xiàng)5.2 GCC編譯器表中的警告選項(xiàng)與優(yōu)化選項(xiàng)在編譯代碼時(shí)經(jīng)常被使用。如例所示,該程序第5行代碼中定義的變量在整個(gè)程序代碼中并未使用,但是并不影響代碼的運(yùn)行。5.2.3 GCC編譯選項(xiàng)5.2 GCC編譯器對(duì)例所示的代碼分別執(zhí)行普通編譯以及嚴(yán)格編譯,如例所示。從輸出結(jié)果可以看出,如果采用普通編譯,則編譯無誤,并且執(zhí)行成功;而如果添加“-Wall”進(jìn)行嚴(yán)格編譯,

18、則出現(xiàn)警告,提示定義的變量a并未在代碼中使用。嚴(yán)格編譯在程序開發(fā)中建議經(jīng)常使用以提高代碼編寫規(guī)范,優(yōu)化代碼質(zhì)量。5.2.4 GCC編譯版本切換5.2 GCC編譯器不同的編譯器版本,在對(duì)源程序進(jìn)行編譯時(shí),可能會(huì)產(chǎn)生不同的結(jié)果。例如,使用新版本的GCC鏈接舊程序時(shí),由于舊程序的.o文件對(duì)函數(shù)的修飾可能與新版本不同,編譯時(shí)可能會(huì)出現(xiàn)一些新的警告。不同版本的GCC配置的庫也不盡相同,這可能導(dǎo)致文件編譯時(shí)出現(xiàn)意想不到的錯(cuò)誤。鑒于上述情況,開發(fā)者在為操作系統(tǒng)搭建編譯器時(shí),一般會(huì)選擇最適合當(dāng)前開發(fā)的編譯器版本,而非版本越新越好。接下來將展示如何在Ubuntu系統(tǒng)中配置多個(gè)版本的GCC編譯器版并切換使用,從而

19、保證系統(tǒng)在任何時(shí)候都可以快速進(jìn)行編譯開發(fā)。5.2.4 GCC編譯版本切換5.2 GCC編譯器(1)查看系統(tǒng)原裝的GCC版本,使用命令“gcc -v”(C語言編譯)或“g+ -v”(C+語言編譯),如例所示,gcc與g+的版本號(hào)一致,都為5.4.0。5.2.4 GCC編譯版本切換5.2 GCC編譯器(2)安裝其他版本的GCC,如例所示,選擇在線安裝GCC 4.8。5.2.4 GCC編譯版本切換5.2 GCC編譯器安裝完成后,查看當(dāng)前系統(tǒng)中安裝的所有g(shù)cc與g+版本。如例所示,當(dāng)前系統(tǒng)支持4.8與5(5.4.0)兩個(gè)版本。(3)將下載的4.8版本的gcc與g+加入候補(bǔ)名單,并設(shè)置優(yōu)先級(jí),優(yōu)先級(jí)設(shè)置

20、為100,如例所示。5.2.4 GCC編譯版本切換5.2 GCC編譯器將系統(tǒng)中原有的5.4版本的gcc優(yōu)先級(jí)同樣也設(shè)置為100,避免在選擇完使用版本之后系統(tǒng)恢復(fù)默認(rèn)優(yōu)先級(jí)的版本,如例所示。g+的設(shè)置與例中展示的gcc一致,如例所示。5.2.4 GCC編譯版本切換5.2 GCC編譯器(4)通過指令切換不同版本的GCC,如例所示,可直接輸入序號(hào)(這里選擇1)。5.2.4 GCC編譯版本切換5.2 GCC編譯器g+與gcc切換方式一致,如例所示,直接輸入序號(hào)選擇(這里選擇1)。(5)檢查gcc與g+版本,查看是否切換成功。如例所示,gcc與g+成功切換為4.8.5版本。5.2.4 GCC編譯版本切換

21、5.2 GCC編譯器結(jié)合以上步驟,讀者可根據(jù)系統(tǒng)需求進(jìn)行編譯器的合理切換,完成編譯工作。5.3 GDB調(diào)試器5.3.1GDB調(diào)試器簡介返回目錄5.3.2GDB調(diào)試器的使用5.3.3GDB基本命令5.3.1 GDB調(diào)試器簡介5.3 GDB調(diào)試器1.GDB調(diào)試器概念GDB(GNU Symbolic Debugger)是GNU開源組織發(fā)布的一款程序調(diào)試工具。與Windows的IDE不同,GDB是純命令執(zhí)行,沒有圖形界面,但是其功能卻比圖形界面調(diào)試器更加強(qiáng)大。調(diào)試工作在產(chǎn)品研發(fā)中占有很重要的位置,一款產(chǎn)品從制定需求到成熟上線,可能需要做完成性測試,單元測試等,這些都離不開調(diào)試工具的使用。GDB可以幫助

22、用戶完成查看程序的內(nèi)部結(jié)構(gòu)、查看自定義程序的啟動(dòng)方式、設(shè)置條件斷點(diǎn)、單步調(diào)試源代碼等各種調(diào)試工作。5.3.1 GDB調(diào)試器簡介5.3 GDB調(diào)試器2.GDB調(diào)試器展示下面將通過一個(gè)示例展示GDB調(diào)試器的使用,編寫一段完整的C語言示例代碼。代碼的功能本意為通過change子函數(shù)將變量a、b中的值進(jìn)行交換,但實(shí)際的情況是change函數(shù)中的形式參數(shù)(形參)a、b的值進(jìn)行交換,與main函數(shù)中的實(shí)際參數(shù)a、b沒有任何關(guān)系(形參a、b與實(shí)參a、b分別占有各自的內(nèi)存地址,互不影響)。因此,最終的運(yùn)行結(jié)果為交換前與交換后打印輸出的a、b的值不會(huì)發(fā)生變化。本節(jié)將通過GDB調(diào)試器對(duì)例的代碼進(jìn)行調(diào)試,并查看程序

23、在運(yùn)行過程中變量的值,從而更好地解釋交換失敗的原因。示例代碼參考教材5.3.1節(jié)。5.3.1 GDB調(diào)試器簡介5.3 GDB調(diào)試器保存例所示的文件,使用GCC編譯器進(jìn)行編譯。編譯時(shí)需要添加“-g”選項(xiàng),從而保證生成的可執(zhí)行代碼包含調(diào)試信息,否則無法使用GDB進(jìn)行調(diào)試。具體如例所示。GDB調(diào)試的目標(biāo)為可執(zhí)行文件。如例所示,使用命令“gdb + 可執(zhí)行文件名”即可啟動(dòng)GDB調(diào)試。5.3.1 GDB調(diào)試器簡介5.3 GDB調(diào)試器例所示的調(diào)試界面中,顯示了GDB調(diào)試器的版本信息以及當(dāng)前調(diào)試文件所在的絕對(duì)路徑。在提示符“(gdb)”后可進(jìn)行命令行輸入,開始調(diào)試工作。如果用戶對(duì)當(dāng)前的輸入命令不確定,可以進(jìn)

24、行查詢,在命令行輸入help即可顯示命令幫助,如例所示。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器1.查看文件內(nèi)容在調(diào)試代碼之前,可以先通過GDB查看代碼的中的內(nèi)容(代碼見例5-24)。在GDB命令行輸入?yún)^(qū)域中輸入list即可查看調(diào)試的文件。示例代碼參考教材5.3.2節(jié),一次性只能顯示部分內(nèi)容(默認(rèn)10行),直到顯示結(jié)束為主。2.設(shè)置斷點(diǎn)設(shè)置斷點(diǎn)在代碼調(diào)試過程中十分關(guān)鍵。在代碼的某一處設(shè)置斷點(diǎn)后,程序運(yùn)行到該斷點(diǎn)處就會(huì)停止,即只運(yùn)行斷點(diǎn)之前的代碼。使用命令break設(shè)置斷點(diǎn),其設(shè)置的方式有很多。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器具體如表所示。5.3.2 GDB調(diào)試器使用5.

25、3 GDB調(diào)試器在例所示的代碼中,選擇第7、8、9、19、21、24行設(shè)置斷點(diǎn)。具體操作如例所示。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器3.查看斷點(diǎn)查看斷點(diǎn)使用info命令,常用的語法格式如下所示。如例所示,查看斷點(diǎn)2的信息,即代碼第8行。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器4.運(yùn)行代碼斷點(diǎn)設(shè)置完成后即可運(yùn)行代碼,輸入r(run)開始運(yùn)行(GDB默認(rèn)從首行開始運(yùn)行,如果需要從程序中指定的行開始運(yùn)行,在r后添加行號(hào)即可)。如例所示,程序開始運(yùn)行,到斷點(diǎn)4(不包括第20行)停止。此時(shí)main函數(shù)中變量a、b的值分別為10、20。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器

26、如例所示,程序運(yùn)行到例中所示的斷點(diǎn)時(shí),查看結(jié)果。變量a、b的值分別為10、20,子函數(shù)中變量temp顯示無符號(hào)(此時(shí)子函數(shù)并未調(diào)用)。5.查看變量值使用命令p查看程序運(yùn)行到斷點(diǎn)時(shí)變量的值,其常用的語法格式如下所示。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器6.恢復(fù)程序運(yùn)行、單步運(yùn)行當(dāng)程序在斷點(diǎn)處停止時(shí),使用命令continue可以恢復(fù)程序運(yùn)行,一直到下一個(gè)斷點(diǎn)處或程序結(jié)束。如例所示,繼續(xù)運(yùn)行代碼,直到下一個(gè)斷點(diǎn)處。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器例中,程序調(diào)用子函數(shù)change,運(yùn)行到斷點(diǎn)處1。局部變量temp已經(jīng)被賦值,形參a、b的值分別為10、20,實(shí)際參數(shù)a、b的值

27、分別為10、20。如例所示,繼續(xù)運(yùn)行到斷點(diǎn)2,可見形參的值發(fā)生變化,形參a的值變?yōu)?0,形參b的值未變化為20。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器如例所示,繼續(xù)運(yùn)行到斷點(diǎn)3,此時(shí)子函數(shù)執(zhí)行完成。查看變量的值,可見子函數(shù)中形參a、b的值確實(shí)發(fā)生了交換。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器如例所示,繼續(xù)運(yùn)行到斷點(diǎn)4。查看變量的值,可見變量a、b的值未發(fā)生交換(a、b為實(shí)際參數(shù))。子函數(shù)結(jié)束,變量temp的生命周期已經(jīng)結(jié)束,因此顯示無符號(hào)。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器如例所示,繼續(xù)運(yùn)行到斷點(diǎn)5。打印變量a、b的值,可見在執(zhí)行交換后并未發(fā)生變化,這驗(yàn)證了形

28、參的轉(zhuǎn)變與實(shí)參沒有任何關(guān)系。因此,例5-24的代碼也是錯(cuò)誤的,無法實(shí)現(xiàn)交換值的需求。上述運(yùn)行也可以使用命令step或命令next進(jìn)行單步操作。單步執(zhí)行的語法格式如下所示。5.3.2 GDB調(diào)試器使用5.3 GDB調(diào)試器其中選項(xiàng)count可選擇性設(shè)置,如果不添加count,每次執(zhí)行一條指令;如果添加count,則代碼一次執(zhí)行count條指令,然后再停止。二者的本質(zhì)區(qū)別為單步執(zhí)行的指令數(shù)量不同。命令step與next雖同為單步執(zhí)行操作,但命令step在指定單步執(zhí)行時(shí),如果出現(xiàn)函數(shù)調(diào)用,則會(huì)進(jìn)入該函數(shù);命令next與之相反,在執(zhí)行單步操作時(shí),如果出現(xiàn)函數(shù)調(diào)用,不會(huì)進(jìn)入該函數(shù)。最后給出例5-24修改后

29、的代碼示例,讀者可參考對(duì)比。示例代碼參考教材5.3.2節(jié),通過地址傳遞實(shí)現(xiàn)變量值的交換。5.3.3 GDB基本命令5.3 GDB調(diào)試器5.3.2節(jié)通過一個(gè)完整的示例展示了如何使用GDB調(diào)試器對(duì)代碼進(jìn)行基本的調(diào)試。其中用到了一些GDB調(diào)試器的基本命令,這些命令還不能滿足實(shí)際開發(fā)的測試需求。GDB作為一款強(qiáng)大的調(diào)試工具,支持的調(diào)試指令還有很多。下面將對(duì)這些命令進(jìn)行說明,具體表參考教材5.3.3節(jié)。GDB調(diào)試器的命令還有很多,包括對(duì)堆棧、變量、數(shù)組等操作,這里不再展示,讀者可根據(jù)需求在網(wǎng)絡(luò)中查詢具體命令。5.4 Make工程管理器5.4.1Make工程管理器簡介返回目錄5.4.2Makefile的使

30、用5.4.3Makefile的規(guī)則5.4.1 Make工程管理器簡介 5.4 Make工程管理器Make是一種工程管理器,其本質(zhì)為管理多文件的一種工具。通常情況下,Make被用來編譯源代碼,其特點(diǎn)在于Make可以實(shí)現(xiàn)自動(dòng)編譯,所謂自動(dòng)編譯即根據(jù)文件的時(shí)間戳自動(dòng)發(fā)現(xiàn)更新過的文件,以減少編譯的工作量。通俗地說,即Make在編譯代碼時(shí),只編譯改動(dòng)的文件,其他未改動(dòng)且已經(jīng)編譯過的文件將不再編譯,這大大縮短了編譯的時(shí)間,提高了編譯的效率。Make工程管理器的核心文件為Makefile。Makefile中有3個(gè)關(guān)鍵的元素:目標(biāo)(Target)、依賴(Dependency)、命令(Command)。5.4.

31、1 Make工程管理器簡介 5.4 Make工程管理器Makefile解釋了如何通過相關(guān)命令將依賴文件變?yōu)槟繕?biāo)文件,而這些命令需傳遞給Shell去執(zhí)行。因此,Makefile所使用的語言為腳本語言。Makefile中最常用的語法格式如下所示。其中“”表示通過Tab物理鍵進(jìn)行縮進(jìn),注意,不能使用空格鍵代替。5.4.2 Make的使用5.4 Make工程管理器Makefile的編寫需要開發(fā)者具備一定的Shell編程能力,但是在實(shí)際的開發(fā)中,編寫Makefile進(jìn)行代碼管理的情況比較少。一般情況下,開發(fā)者能調(diào)試Makefile代碼,讀懂較復(fù)雜的Makefile即可。Linux操作系統(tǒng)內(nèi)核源代碼中的M

32、akefile編寫十分經(jīng)典,是眾多嵌入式開發(fā)者學(xué)習(xí)并開發(fā)的模板。下面主要通過一個(gè)示例來展示Makefile的基本使用。首先創(chuàng)建一個(gè)項(xiàng)目倉庫(目錄),并創(chuàng)建文件main.c、func.c、func.h,如例所示。5.4.2 Make的使用5.4 Make工程管理器使用Vim編輯器編寫文件內(nèi)容,其中main.c文件內(nèi)容如例所示,可見其的功能為調(diào)用封裝函數(shù)func。需要注意的是,使用include聲明頭文件,使用“ ”與“”表示的意義完全不同。使用引號(hào)時(shí),先搜索工程文件所在目錄,再搜索編譯器頭文件所在的目錄;使用尖括號(hào)時(shí)則順序相反。假設(shè)有兩個(gè)文件名一樣的頭文件head.h,但內(nèi)容不一樣。5.4.2

33、Make的使用5.4 Make工程管理器一個(gè)保存在編譯器指定的頭文件目錄下,稱為文件1;另一個(gè)則保存在當(dāng)前工程的目錄下,稱為文件2。如果在指定頭文件時(shí)使用的是“#include ”,時(shí)引用的頭文件是文件1。如果在指定頭文件時(shí)使用的是“#include head.h”,時(shí)引用的頭文件是文件2。func.c文件的內(nèi)容如例所示,可見代碼func.c實(shí)現(xiàn)了函數(shù)func的功能。5.4.2 Make的使用5.4 Make工程管理器main.c中指定了頭文件func.h,其文件內(nèi)容如例所示,用來聲明函數(shù)func。這樣編寫的意思是,如果沒有定義_FUNC_H,則定義_FUNC_H,并編譯下面的代碼,直到遇到#

34、endif。這樣,當(dāng)重復(fù)引用時(shí),由于_FUNC_H已經(jīng)被定義,下面的代碼將不會(huì)被編譯,避免了重復(fù)定義。5.4.2 Make的使用5.4 Make工程管理器綜合以上示例代碼,可知main.c中調(diào)用了函數(shù)func,func.c中實(shí)現(xiàn)了函數(shù)func的功能,func.h中聲明了封裝函數(shù)func。使用GCC編譯器編譯上述代碼,如例所示。5.4.2 Make的使用5.4 Make工程管理器例中,最終編譯時(shí),需要將實(shí)現(xiàn)子函數(shù)功能的代碼與主函數(shù)所在的代碼一同編譯。如果封裝的子函數(shù)較少,或者封裝的文件較少,這種編譯方式并沒有太大的問題。但是如果程序調(diào)用的子函數(shù)較多,且這些子函數(shù)在不同的文件中實(shí)現(xiàn),那么在執(zhí)行編譯

35、命令時(shí),則會(huì)顯得十分笨拙。因此,通過Makefile實(shí)現(xiàn)多文件的編譯管理更加方便。運(yùn)用5.4.1節(jié)中介紹的Makefile基本語法格式,結(jié)合例的編譯情況,編寫一個(gè)基本的Makefile來實(shí)現(xiàn)代碼的編譯。5.4.2 Make的使用5.4 Make工程管理器如例所示。例所示的Makefile,如果需要執(zhí)行編譯處理,則只需要執(zhí)行make。5.4.2 Make的使用5.4 Make工程管理器如例所示。如需要?jiǎng)h除編譯生成的目標(biāo)文件,則執(zhí)行make clean即可。執(zhí)行此命令,意味著執(zhí)行Makefile(例5-44)中clean關(guān)鍵字下的刪除操作。5.4.2 Make的使用5.4 Make工程管理器如例所

36、示,執(zhí)行刪除操作。例中展示的Makefile顯然不是一個(gè)合理的版本,因?yàn)橐坏┚幾g涉及的文件名發(fā)生變化,則Makefile同樣需要修改。這樣的Makefile通用性并不高,因此可以考慮將Makefile變得更加通用化,這就需要使用Makefile中的自動(dòng)變量。5.4.2 Make的使用5.4 Make工程管理器Makefile中的變量與C語言程序中的變量類似,只是不指定變量的類型。而自動(dòng)變量可以理解為Makefile中系統(tǒng)預(yù)定義的變量,無須用戶定義,直接使用即可。使用這些變量的目的就是替換原先文件中的名字或選項(xiàng)參數(shù),從而減少M(fèi)akefile中需修改的代碼量,提高使用Makefile的工作效率。5

37、.4.2 Make的使用5.4 Make工程管理器Makefile中常用的預(yù)定義變量與自動(dòng)變量如表所示。5.4.2 Make的使用5.4 Make工程管理器利用表中給定的變量對(duì)例5-44中的Makefile進(jìn)行修改。如例所示,使用自動(dòng)變量替換原來的文件名。5.4.2 Make的使用5.4 Make工程管理器使用例5-47所示的Makefile仍然不是最理想化的??蓪?duì)Makefile添加自定義的變量,再次進(jìn)行優(yōu)化,如例所示。注意,Shell編程中引用變量需要使用“$”。5.4.2 Make的使用5.4 Make工程管理器例所示的代碼已基本符合Makefile的編寫思想。這樣,涉及修改Makefile中的文件時(shí),只需要修改變量的賦值即可,明顯減少了代碼的修改量。5.4.3 Make的規(guī)則5.4 Make工程管理器1.編譯C程序的隱含規(guī)則隱含規(guī)則:“xxx.o”的依賴會(huì)自動(dòng)推導(dǎo)為“xxx.c”,并且其生成的命令為“$(CC) -c $(C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論