實驗五常用軟件開發(fā)工具_第1頁
實驗五常用軟件開發(fā)工具_第2頁
實驗五常用軟件開發(fā)工具_第3頁
免費預覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、實驗五、常用軟件開發(fā)工具 一、實驗目的1、熟悉字符模式下的 C 程序編譯和調(diào)試環(huán)境,基本掌握 Linux 字符模式下的編譯工具和調(diào) 試工具的使用;2、本實驗需要綜合使用 Linux 基本文件命令、編輯器的使用,練習在Linux 的字符模式下,編輯、編譯及調(diào)試一個 C 程序的基本方法。二、實驗內(nèi)容和步驟1 gcc 和 g+ 語言編譯器GCC是GNU Compiler Collection的縮寫,它是世界上最為重要的開放源代碼軟件 18。因為 所有其他的開放源代碼項目都依賴于 GCC進行編譯。比如,沒有 GCC Linux的產(chǎn)生就不會 成為可能。GCC能工作在很多平臺上,這里所說的平臺是指計算機硬

2、件芯片和運行在其上的操作系統(tǒng) 的組合。下表是GCC運行的平臺。表GCC運行的平臺硬件操作系統(tǒng)AlphaRed Hat Linux 7.1HPPAHPUX 11.0Intel x86Debian Linux 2.2, Red Hat Linux 6.2, FreeBSD 4.5MIPSIRIX 6.5PowerPCSparcSolaris 2.7GCC可以編譯多種語言:C, C+,對象C (標準C的派生), Fortran , Java,Ada。正如GCC縮寫所代表的對象一樣, GCC實際上是多種編譯器的統(tǒng)稱, gcc是所有編譯器的統(tǒng)一的 程序接口,在本書中,并沒有區(qū)分 GCC和gcc。同時,G

3、CC 也能夠進行代碼優(yōu)化,提高執(zhí) 行程序的運行速度。g+是構(gòu)建于gcc基礎(chǔ)上的C+語言編譯器。gcc 編譯過程分為 4 個階段:l 預處理l 編譯l 匯編l 連接最簡單的 C 語言編譯的例子:用 vi 建立一個 hello.c 文件$vi hello.c輸入字符i,插入文本以下文本/* hello.c*/ #include int main(void)printf( Hello World!n);return 0;最后輸入字符:wq,返回命令行,鍵入以下編譯命令:$gcc hello.c (-lstdc+)如果沒有錯誤gcc將生成默認的可執(zhí)行文件a.out,執(zhí)行a.out:$./a.outHe

4、llo World!$gcc 帶有多達數(shù)頁的編譯選項,我們僅列出最常用的幾項:-o 可執(zhí)行文件名 指定輸出的可執(zhí)行文件名,而不是默認的 a.out-c-s只編譯生成 .o 的目標文件 ,不連接生成可執(zhí)行文件 只編譯生成 .s 的匯編文件 ,不連接生成可執(zhí)行文件-g-Wall在可執(zhí)行文件中加入標準調(diào)試信息 允許GCC發(fā)出警告型錯誤信息選項使用的例子 :對以上 hello.c 使用 -o,-g 常用選項重新編譯、執(zhí)行$gcc -g hello.c -o hello$./helloHello World!$GCC默認的擴展文件名:.c C 語言源代碼.C .ccC+語言源代碼.i預處理后的 C 語言

5、源代碼.ii預處理后的 C+語言源代碼.S .s 匯編語言源代碼.o編譯后的目標代碼.a.so 編譯后的庫代碼下面的例子由兩個文件組成:main.c, calc.c,其中,main.c文件內(nèi)容為:#include int calc(int);int main(int argc, char* argv)int iInput=0, iOutput=0;int i=0;scanf(%i,&iInput);while(iInput 0)printf(Please input a positive integer!n); scanf(%i,&iInput);iOutput = calc(iInput);

6、printf(Result is:%in, iOutput); return 0;calc.c 的文件內(nèi)容為:#include int calc(int iIn)int i = 0, iOut = 0;iOut = iIn;for(i = 0; i iIn; i+)iOut += iOut * iIn;return iOut;1、編譯過程 有三種方式編譯這兩個源程序,一是直接使用如下命令行完成編譯、鏈接過程:$gcc main.c calc.c -o main命令行中,main.c calc.c的后綴名指明了調(diào)用 c編譯器,前面講到了 gcc是GCC的眾多編譯 器的統(tǒng)一入口, gcc 靠后綴名

7、決定調(diào)用什么編譯器, -o 參數(shù)指定了可執(zhí)行文件的文件名為 main。第二種方法是編譯 calc.c 為靜態(tài)庫,編譯 main.c 時指定靜態(tài)庫的位置。 需要將calc.c編譯成中間文件calc.o,使用如下命令行:$gcc -c calc.c生成靜態(tài)庫文件,添加 calc.o 到靜態(tài)庫中,使用如下命令行:$ar -r libcalc.a calc.o命令行中, -r libcalc.a 參數(shù)表示建立靜態(tài)庫,名字為libcalc.a。接下來,使用如下命令行:$gcc main.c libcalc.a -o main上面這條命令也可以用下面的命令完成:$gcc mai n.c -Icalc ma

8、in-I參數(shù)可以指定庫名稱,這里calc表示使用庫libcalc.a,庫名字前面的lib和后面的.a被省略掉了,遵從了命名法。第三種方法是建立共享庫,編譯時指定共享庫。首先,編譯calc.c為calc.o,使用命令行:$gcc -c -fpic calc.c命令行中, -fpic 指定 calc.o 為可重分配地址屬性, pic 是 position independence code 的縮寫。接下來使用 calc.o 生成共享庫 calc.so:$gcc -shared calc.o -o calc.so這兩條命令也可以縮減為一行:$gcc -shared -fpic calc.c -o c

9、alc.so最后編譯 main.c, 鏈接生成的共享庫:$gcc main.c calc.so -o main2 make 項目管理器make項目管理器(GNU中的名稱為gmake)可以根據(jù)項目開發(fā)者說明的項目開 發(fā)文件 Makefile 自動的進行編譯配置和重復編譯,能實現(xiàn)復雜項目的編譯自動化。項目開發(fā)文件 Makefile 的編寫使用以下規(guī)則:目標體 1: 依賴體 1 依賴體 2 .命令行 1命令行 2.目標體 2: 依賴體 1 依賴體 2 .命令行 1命令行 2 . 其中目標體是命令行要生成的輸出文件,依賴體是命令行要輸入的文件或選項,命 令行序列是要創(chuàng)建目標體文件所需要的步驟,例如編譯

10、命令。無特別指定,make總是使用當前目錄中的 Makefile 進行自動編譯。例如我們在當前目錄中有兩個項目開發(fā)文件hello.c和hello.h,則Makefile文件可以編寫為:hello: hello.ogcc hello.o -o hellohello.o: hello.c hello.hgcc -c hello.cclean:rm hello *.omake 命令的使用:$g make輸入 make 或 make hello 將生成 Makefile 中所有的目標文件,即 hello,hello.o,hello.s 。$g make hello.o將僅生成目標文件 hello.o$

11、g make clean 是一條偽目標生成命令,該目標沒有依賴體,它只執(zhí)行對已生成目標文件的刪除。當我們 對以上依賴體中的任意一個進行了修改,重新 make 時僅會引發(fā)對應(yīng)目標體的重新生成, 從而提高了編譯的效率并保證了項目開發(fā)的正確性。3 gdb 程序調(diào)試器GDB 是 GNU Project Debugger 的縮寫,用于調(diào)試 Ada, C, C+, Objective-C, Pascal 和其他語言 編寫的程序 20,這些程序可以運行在本地計算機上,也可以運行在遠程計算機上。GDB可以運行在幾乎所有的 UNIX 和微軟 Windows 平臺上。GDB 主要能做下面 4 種事(以及由它們所支

12、持的其他事情) :1)啟動程序,指定可能影響程序運行的任何條件;2)指定程序在一定條件下停止;3)檢查當程序停止時發(fā)生的事情;4)通過改變程序中的某些條件,測試可能造成的軟件錯誤,還可以由此學習其他的軟件錯 誤。GDB 可以做源代碼級別的程序調(diào)試(需要在編譯時指定相應(yīng)條件),也可以做二進制級別的程序調(diào)試。如果您在 gcc 編譯選項中用到了 -g 調(diào)試選項,則編譯出的可執(zhí)行文件就會帶有符號表。 這樣的程序就可以使用 gdb 跟蹤調(diào)試,觀察到它的高級語言源代碼的執(zhí)行過程和變量的中 間結(jié)果,從而能快速的排除程序運行時發(fā)生的錯誤。以下是一個帶有運行時錯誤的C 程序 ,注意程序想通過傳地址方式在一個函數(shù)

13、中為字符變量C 賦一個字符,但它引用了一個空指針,這將引發(fā)運行時的段非法錯誤使得程序異常終止。但我們可以通過gdb 跟蹤到它產(chǎn)生錯誤的位置,從而分析出產(chǎn)生錯誤的原因。/* debugmy.c*/#include void myputc(char * cptr)*cptr = a;printf(myputc=%cn,*cptr);int main(void)char c; char * cptr; c = A; myputc(cptr); return 0;使用帶 -g 選項的 gcc 編譯、執(zhí)行:$gcc -g debugmy.c -o debugmy$ ./debugmy 段錯誤 $ 使用

14、gdb 跟蹤查錯$ gdb ./debugmy2004 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type show copying to see the conditions.There is absolutely no warranty for GDB.Type sh

15、ow warranty for details.libraryGdb 常This GDB was configured as i386-redhat-linux-gnu.(gdb)現(xiàn)在進入了 gdb 調(diào)試狀態(tài),可以使用 gdb 的調(diào)試 子 命令跟蹤程序的執(zhí)行。 用命令:list 行號 列出指定行號的上下行(缺省為 10 行) break 源程序文件名: 行號 建立一個斷點 run 啟動被調(diào)試的程序 next 從斷點處向下執(zhí)行一行step 從斷點處向下執(zhí)行一行,當前行為函數(shù)則跟蹤進入函數(shù) continue 繼續(xù)從斷點處連續(xù)執(zhí)行 print 變量名 打印變量當前值 quit 退出 gdb讓我們現(xiàn)使

16、用 list 命令查看一下要調(diào)試的程序是否已經(jīng)裝入,輸入: (gdb)list 105 void myputc(char * cptr)6 7 *cptr = a;8 printf(myputc=%cn,*cptr);9 10 int main(void)11 12 char c;13 char * cptr;c = A;我們將斷點設(shè)在第 15 行上,輸入:(gdb) break 15Breakpoint 1 at 0x80483c0: file debugmy.c, line 15. 開始跟蹤執(zhí)行,輸入:(gdb) runStarting program: /root/ipc/debugmyReading symbols from shared object read from target memory.done.Loaded system supplied DSO at 0xffffe000Breakpoint 1, main () at debugmy.c:1515 myputc(cptr); 程序執(zhí)行到第 15 行上停止,我們采用單步執(zhí)行跟蹤錯誤的發(fā)生,輸入 :

溫馨提示

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

評論

0/150

提交評論