


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)五、常用軟件開發(fā)工具 一、實(shí)驗(yàn)?zāi)康?、 熟悉字符模式下的 C程序編譯和調(diào)試環(huán)境,基本掌握Linux字符模式下的編譯工具和調(diào) 試工具的使用;2、 本實(shí)驗(yàn)需要綜合使用Linux基本文件命令、編輯器的使用,練習(xí)在Linux的字符模式下,編輯、編譯及調(diào)試一個(gè) C 程序的基本方法。二、實(shí)驗(yàn)內(nèi)容和步驟1 gcc 和 g+ 語(yǔ)言編譯器GCC是GNU Compiler Collection的縮寫,它是世界上最為重要的開放源代碼軟件 18。因?yàn)?所有其他的開放源代碼項(xiàng)目都依賴于 GCC進(jìn)行編譯。比如,沒有 GCC,Linux的產(chǎn)生就不會(huì) 成為可能。GCC能工作在很多平臺(tái)上,這里所說的平臺(tái)是指計(jì)算機(jī)硬件芯片和
2、運(yùn)行在其上的操作系統(tǒng)的 組合。下表是GCC運(yùn)行的平臺(tái)。表GCC運(yùn)行的平臺(tái)硬件操作系統(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可以編譯多種語(yǔ)言:C, C+,對(duì)象C (標(biāo)準(zhǔn)C的派生),F(xiàn)ortran, Java, Ada。正如GCC縮寫所代表的對(duì)象一樣,GCC實(shí)際上是多種編譯器的統(tǒng)稱,gcc是所有編譯器的統(tǒng)一的程序接口,在本書中,并沒有區(qū)分GCC和gcc。同時(shí),GCC也能夠進(jìn)行代碼
3、優(yōu)化,提高執(zhí)行程序的運(yùn)行速度。g+是構(gòu)建于gcc基礎(chǔ)上的C+語(yǔ)言編譯器。gcc 編譯過程分為 4 個(gè)階段:l 預(yù)處理l 編譯l 匯編l 連接最簡(jiǎn)單的 C 語(yǔ)言編譯的例子:用 vi 建立一個(gè) hello.c 文件$vi hello.c輸入字符i,插入文本以下文本/* hello.c*/#include <stdio.h>int main(void)printf(" Hello World!n");return 0;最后輸入字符<Esc>:wq,返回命令行,鍵入以下編譯命令:$gcc hello.c (-lstdc+)如果沒有錯(cuò)誤 gcc將生成默認(rèn)的可執(zhí)
4、行文件a.out,執(zhí)行a.out:$./a.outHello World!$gcc 帶有多達(dá)數(shù)頁(yè)的編譯選項(xiàng),我們僅列出最常用的幾項(xiàng):-o 可執(zhí)行文件名 指定輸出的可執(zhí)行文件名,而不是默認(rèn)的 a.out-c只編譯生成 .o 的目標(biāo)文件 ,不連接生成可執(zhí)行文件-s只編譯生成.s的匯編文件,不連接生成可執(zhí)行文件-g在可執(zhí)行文件中加入標(biāo)準(zhǔn)調(diào)試信息-Wall允許GCC發(fā)出警告型錯(cuò)誤信息選項(xiàng)使用的例子 :對(duì)以上 hello.c 使用 -o,-g 常用選項(xiàng)重新編譯、執(zhí)行 :$gcc -g hello.c -o hello$./helloHello World!$GCC默認(rèn)的擴(kuò)展文件名:.c C 語(yǔ)言源代碼.
5、C .ccC+語(yǔ)言源代碼i預(yù)處理后的C語(yǔ)言源代碼.ii預(yù)處理后的 C+語(yǔ)言源代碼.S .s 匯編語(yǔ)言源代碼.o編譯后的目標(biāo)代碼.a.so 編譯后的庫(kù)代碼下面的例子由兩個(gè)文件組成:main.c, calc.c,其中,main.c文件內(nèi)容為:#include <stdio.h>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
6、a positive integer!n"); scanf("%i",&iInput);iOutput = calc(iInput);printf("Result is:%in", iOutput); return 0;calc.c的文件內(nèi)容為:#include <stdio.h>int calc(int iIn)int i = 0, iOut = 0;iOut = iIn;for(i = 0; i < iIn; i+)iOut += iOut * iIn;return iOut;1、編譯過程 有三種方式編譯這兩個(gè)源程
7、序,一是直接使用如下命令行完成編譯、鏈接過程:$gcc main.c calc.c -o main命令行中,main.c calc.c的后綴名指明了調(diào)用c編譯器,前面講到了gcc是GCC的眾多編譯器的統(tǒng)一入口, gcc 靠后綴名決定調(diào)用什么編譯器, -o 參數(shù)指定了可執(zhí)行文件的文件名為 main 。第二種方法是編譯calc.c為靜態(tài)庫(kù),編譯main.c時(shí)指定靜態(tài)庫(kù)的位置。需要將calc.c編譯成中間文件calc.o,使用如下命令行:$gcc -c calc.c生成靜態(tài)庫(kù)文件,添加 calc.o 到靜態(tài)庫(kù)中,使用如下命令行:$ar -r libcalc.a calc.o命令行中, -r libc
8、alc.a 參數(shù)表示建立靜態(tài)庫(kù),名字為 libcalc.a。 接下來,使用如下命令行:$gcc main.c libcalc.a -o main上面這條命令也可以用下面的命令完成:$gcc mai n.c -lcalc o main-l參數(shù)可以指定庫(kù)名稱,這里calc表示使用庫(kù)libcalc.a,庫(kù)名字前面的lib和后面的.a被省略掉了,遵從了命名法。第三種方法是建立共享庫(kù),編譯時(shí)指定共享庫(kù)。首先,編譯calc.c為calc.o,使用命令行:$gcc -c -fpic calc.c命令行中,-fpic指定calc.o為可重分配地址屬性,pic是position independenee cod
9、e的縮寫。 接下來使用 calc.o 生成共享庫(kù) calc.so:$gcc -shared calc.o - o calc.so這兩條命令也可以縮減為一行:$gcc -shared -fpic calc.c -o calc.so最后編譯main.c,鏈接生成的共享庫(kù):$gcc main.c calc.so -o main2 make 項(xiàng)目管理器make項(xiàng)目管理器(GNU中的名稱為gmake)可以根據(jù)項(xiàng)目開發(fā)者說明的項(xiàng)目開 發(fā)文件 Makefile 自動(dòng)的進(jìn)行編譯配置和重復(fù)編譯 ,能實(shí)現(xiàn)復(fù)雜項(xiàng)目的編譯自動(dòng)化。 項(xiàng)目開發(fā)文件 Makefile 的編寫使用以下規(guī)則:目標(biāo)體 1:依賴體 1 依賴體 2
10、 .命令行 1命令行 2.目標(biāo)體 2:依賴體 1 依賴體 2 .命令行 1命令行 2. 其中目標(biāo)體是命令行要生成的輸出文件,依賴體是命令行要輸入的文件或選項(xiàng),命 令行序列是要?jiǎng)?chuàng)建目標(biāo)體文件所需要的步驟,例如編譯命令。無特別指定,make總是使用當(dāng)前目錄中的 Makefile 進(jìn)行自動(dòng)編譯。例如我們?cè)诋?dāng)前目錄中有兩個(gè)項(xiàng)目開發(fā)文件hello.c和hello.h,貝U Makefile文件可以編寫為:hello: hello.ogcc hello.o -o hello hello.o: hello.c hello.hgcc -c hello.cclean:rm hello *.omake 命令的使用
11、:$g make輸入 make 或 make hello 將生成 Makefile 中所有的目標(biāo)文件,即 hello,hello.o,hello.s 。$g make hello.o將僅生成目標(biāo)文件 hello.o$g make clean是一條偽目標(biāo)生成命令, 該目標(biāo)沒有依賴體, 它只執(zhí)行對(duì)已生成目標(biāo)文件的刪除。 當(dāng)我們對(duì) 以上依賴體中的任意一個(gè)進(jìn)行了修改,重新 make 時(shí)僅會(huì)引發(fā)對(duì)應(yīng)目標(biāo)體的重新生成,從 而提高了編譯的效率并保證了項(xiàng)目開發(fā)的正確性。3 gdb 程序調(diào)試器GDB是 GNU Project Debugger 的縮寫,用于調(diào)試 Ada, C, C+, Objective-C,
12、Pascal 和其他語(yǔ)言 編寫的程序20,這些程序可以運(yùn)行在本地計(jì)算機(jī)上,也可以運(yùn)行在遠(yuǎn)程計(jì)算機(jī)上。GDB可以運(yùn)行在幾乎所有的 UNIX 和微軟 Windows 平臺(tái)上。GDB主要能做下面4種事(以及由它們所支持的其他事情):1)啟動(dòng)程序,指定可能影響程序運(yùn)行的任何條件;2)指定程序在一定條件下停止;3)檢查當(dāng)程序停止時(shí)發(fā)生的事情;4)通過改變程序中的某些條件,測(cè)試可能造成的軟件錯(cuò)誤,還可以由此學(xué)習(xí)其他的軟件錯(cuò)誤。GDB可以做源代碼級(jí)別的程序調(diào)試(需要在編譯時(shí)指定相應(yīng)條件),也可以做二進(jìn)制級(jí)別的程序調(diào)試。如果您在 gcc 編譯選項(xiàng)中用到了 -g 調(diào)試選項(xiàng),則編譯出的可執(zhí)行文件就會(huì)帶有符號(hào)表。這
13、 樣的程序就可以使用 gdb 跟蹤調(diào)試,觀察到它的高級(jí)語(yǔ)言源代碼的執(zhí)行過程和變量的中間 結(jié)果,從而能快速的排除程序運(yùn)行時(shí)發(fā)生的錯(cuò)誤。以下是一個(gè)帶有運(yùn)行時(shí)錯(cuò)誤的C程序,注意程序想通過傳地址方式在一個(gè)函數(shù)中為字符變量C賦一個(gè)字符,但它引用了一個(gè)空指針,這將引發(fā)運(yùn)行時(shí)的段非法錯(cuò)誤使得程序異常終止。但我們可以通過gdb 跟蹤到它產(chǎn)生錯(cuò)誤的位置,從而分析出產(chǎn)生錯(cuò)誤的原因。/* debugmy.c*/#include <stdio.h>void myputc(char * cptr)*cptr = 'a'printf("myputc=%cn",*cptr);
14、int main(void)char c;char * cptr; c = 'A' myputc(cptr); return 0;使用帶 -g 選項(xiàng)的 gcc 編譯、執(zhí)行:$gcc -g debugmy.c -o debugmy$ ./debugmy 段錯(cuò)誤$使用 gdb 跟蹤查錯(cuò)$ 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
15、/or distribute copies of it under certain conditions. Type "show copying" to see the conditions.There is absolutely no warranty for GDB.Type "show warranty" for details.libraryGdb 常This GDB was configured as "i386 -redhat -linux-gnu".(gdb)現(xiàn)在進(jìn)入了 gdb 調(diào)試狀態(tài),可以使用 gdb 的調(diào)試 子 命
16、令跟蹤程序的執(zhí)行。 用命令:list 行號(hào) 列出指定行號(hào)的上下行(缺省為10行)break 源程序文件名: 行號(hào) 建立一個(gè)斷點(diǎn) run 啟動(dòng)被調(diào)試的程序 next 從斷點(diǎn)處向下執(zhí)行一行step 從斷點(diǎn)處向下執(zhí)行一行,當(dāng)前行為函數(shù)則跟蹤進(jìn)入函數(shù) continue 繼續(xù)從斷點(diǎn)處連續(xù)執(zhí)行 print 變量名 打印變量當(dāng)前值 quit 退出 gdb讓我們現(xiàn)使用 list 命令查看一下要調(diào)試的程序是否已經(jīng)裝入,輸入: (gdb)list 105 void myputc(char * cptr)6 7 *cptr = 'a'8 printf("myputc=%cn",*
17、cptr);9 10 int main(void)11 12 char c;13 char * cptr;14 c = 'A'我們將斷點(diǎn)設(shè)在第 15 行上,輸入:(gdb) break 15 Breakpoint 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í)行跟蹤錯(cuò)誤的發(fā)生,輸入 :(gdb) stepmyputc (cptr=0x
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)貿(mào)英文合同范例
- 2025年玉樹貨車上崗證理論模擬考試題庫(kù)
- 中信銀行抵押合同范本
- 代為追償服務(wù)合同范本
- 綿陽(yáng)水下安裝拆除施工方案
- 倉(cāng)庫(kù)保管合同范本
- 修路建房合同范本
- 書籍稿件出版合同范本
- 農(nóng)村宅基地分割合同范本
- 勘查委托合同范本
- 建筑工程財(cái)務(wù)流程制度(6篇)
- 2024-2030年中國(guó)廢棄電器電子產(chǎn)品回收處理行業(yè)發(fā)展?fàn)顩r及投資規(guī)劃分析報(bào)告版
- 2024年河北省公務(wù)員考試《行測(cè)》真題及答案解析
- 期末復(fù)習(xí)試題(試題)-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)人教版
- 培訓(xùn)機(jī)構(gòu)收費(fèi)退費(fèi)管理規(guī)定
- JJF 2161-2024焊接檢驗(yàn)尺校準(zhǔn)規(guī)范
- 臨床癲癇MR成像與常見疾病
- 《實(shí)踐論》(原文)毛澤東
- 《基巖標(biāo)建設(shè)技術(shù)導(dǎo)則》
- 2024年急危重癥患者鼻空腸營(yíng)養(yǎng)管管理專家共識(shí)
- 高考化學(xué)一輪復(fù)習(xí)課件微專題19 電解質(zhì)溶液圖像分析
評(píng)論
0/150
提交評(píng)論