工學(xué)實(shí)驗(yàn)四LINUX下C語(yǔ)言使用編譯與調(diào)試實(shí)驗(yàn)2_第1頁(yè)
工學(xué)實(shí)驗(yàn)四LINUX下C語(yǔ)言使用編譯與調(diào)試實(shí)驗(yàn)2_第2頁(yè)
工學(xué)實(shí)驗(yàn)四LINUX下C語(yǔ)言使用編譯與調(diào)試實(shí)驗(yàn)2_第3頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、1)vi的工作模式輸入模式輸入以下命令即可進(jìn)入aAiIoO命令模式在輸入模式下,按:q!:wqZZ:x:w:q實(shí)驗(yàn)四:LINUX下C語(yǔ)言使用、編譯與調(diào)試實(shí)驗(yàn)一、目的:1、練習(xí)并掌握Linux提供的vi編輯器來(lái)編譯C程序2、學(xué)會(huì)利用gcc、gdb編譯、調(diào)試C程序3、學(xué)會(huì)使用make工具二、內(nèi)容1、編寫(xiě)C語(yǔ)言程序,用gcc編譯并觀察編譯后的結(jié)果,運(yùn)行生成的可執(zhí)行文件。2、利用gdb調(diào)試程序。3、學(xué)習(xí)編寫(xiě)makefile,并進(jìn)行編譯。三、操作1、文件編輯器vi進(jìn)入vi,直接執(zhí)彳fvi編輯程序。例:#vitest.c顯示器出現(xiàn)vi的編輯窗口,同時(shí)vi會(huì)將文件復(fù)制一份至緩沖區(qū)(buffer)。vi先對(duì)緩

2、沖區(qū)的文件進(jìn)行編輯,保留在磁盤(pán)中的文件則不變。編輯完成后,使用者可決定是否要取代原來(lái)舊有的文件。vi輸入模式:在光標(biāo)之后加入資料在該行之末加入資料在光標(biāo)之前加入資料在該行之首加入資料新增一行于該行之下新增一行于該行之上ESC可切換到命令模式。命令模式下,可選用下列指令離開(kāi)vi離開(kāi)vi,并放棄剛在緩沖區(qū)內(nèi)編輯的內(nèi)容將緩沖區(qū)內(nèi)的資料寫(xiě)入磁盤(pán)中,并離開(kāi)vi同wq同wq將緩沖區(qū)內(nèi)的資料寫(xiě)入磁盤(pán)中,但并不離開(kāi)vi離開(kāi)vi,若文件被修改過(guò),則要被要求確認(rèn)是否放棄修改的內(nèi)容,此指令可與:w配合使用(3)命令模式下光標(biāo)的移動(dòng)h左移一個(gè)字符j下移一個(gè)字符k上移一個(gè)字符l右移一個(gè)字符0(零)移至該行的行首$移至該

3、行的行尾A移至該行的第一個(gè)字符處H移至窗口的第一行M移至窗口中間那一行L移至窗口的最后一行G移至該文件的最后一行W,w下一個(gè)單詞(W忽略符號(hào))B,b上一個(gè)單詞(B忽略符號(hào))(4)命令模式下的編輯命令dd刪除當(dāng)前光標(biāo)所在行yy復(fù)制當(dāng)前光標(biāo)所在行p將復(fù)制的內(nèi)容粘貼在光標(biāo)所在的位置后p將復(fù)制的內(nèi)容粘貼在光標(biāo)所在的位置前x刪除當(dāng)前光標(biāo)字符X刪除當(dāng)前光標(biāo)之前字符u撤消-重做2、GNUC編譯器1)使用gcc通常后跟一些選項(xiàng)和文件名來(lái)使用gcc編譯器。gcc命令的基本用法如下:gccoptionsfilenames命令行選項(xiàng)指定的編譯過(guò)程中的具體操作2)gcc常用選項(xiàng)當(dāng)不用任何選項(xiàng)編譯一個(gè)程序時(shí),gcc將建

4、立(假定編譯成功)一個(gè)名為a.out的可執(zhí)行文件。選項(xiàng)含義:-oFILE指定輸出文件名,在編譯為目標(biāo)代碼時(shí),這一選項(xiàng)不是必須的。如果FILE沒(méi)有指定,默認(rèn)文件名是a.out.例如,#gcctest.c編譯成功后,當(dāng)前目錄下就產(chǎn)生了一個(gè)a.out文件。也可用-o選項(xiàng)來(lái)為即將產(chǎn)生的可執(zhí)行文件指定一個(gè)文件名來(lái)代替a.outo例如:#gcc-ocountcount.c此時(shí)得到的可執(zhí)行文件就不再是a.out,而是counto-cGCC僅把源代碼編譯為目標(biāo)代碼。默認(rèn)時(shí)GCC建立的目標(biāo)代碼文件有一個(gè).o的擴(kuò)展名。-E對(duì)文件進(jìn)行預(yù)處理-S對(duì)文件進(jìn)行編譯,生成匯編代碼。-O對(duì)源代碼進(jìn)行基本優(yōu)化。這些優(yōu)化在大多數(shù)

5、情況下都會(huì)使程序執(zhí)行得更快。-g在可執(zhí)行程序中包含標(biāo)準(zhǔn)調(diào)試信息。-Wall允許發(fā)出GCC能提供的所有有用的警告,也可以用-W(warning)來(lái)標(biāo)識(shí)指定的盲口。-lname鏈接靜態(tài)庫(kù)3) -Ldir庫(kù)文件的搜索路徑執(zhí)行文件格式:./可執(zhí)行文件名例:# ./a.out./count例子mypow.c:定義mypow()函數(shù)unsignedlonglongmypow(unsignedintx,unsignedinty)unsignedlonglongres=1;if(y=0)res=1;elseif(y=1)res=x;elseres=x*mypow(x,y-1);returnres;powtes

6、t.c:調(diào)用mypow()函數(shù)#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv)(unsignedintx,y;unsignedlonglongres;if(argc<3)|(sscanf(argv1,"%u",&x)!=1|(sscanf(argv2,"%u",&y)!=1)(printf("Usage:powbaseexponentn");exit(1);res=mypow(x,y);printf("%u

7、A%u=%un",x,y,res);return0;編譯過(guò)程:# gcc-cmypow.c# arrcsvlibpow.amypow.oa-mypow.o# gcc-opowtestpowtest.c-L.-lpow# ./powtestUsage:powbaseexponent# ./powtest2101) 2a10=10243、gdb調(diào)試工具調(diào)試編譯代碼為了使gdb正常工作,必須使你的程序在編譯時(shí)包含調(diào)試信息。調(diào)試信息里包含你程序里的每個(gè)變量的類(lèi)型和在可執(zhí)行文件里的地址映射以及源代碼的行號(hào)。gdb利用這些信息使源代碼和機(jī)器碼相關(guān)聯(lián)。在編譯時(shí)用-g選項(xiàng)打開(kāi)調(diào)試選項(xiàng)。2) gdb基

8、本命命令描述file裝入欲調(diào)試的可執(zhí)行文件kill終止正在調(diào)試的程序list列出產(chǎn)生執(zhí)行文件的源代碼部分next執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部step執(zhí)行一行源代碼并進(jìn)入函數(shù)內(nèi)部run執(zhí)行當(dāng)前被調(diào)試的程序quit終止gdbwatch監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變break在代碼里設(shè)置斷點(diǎn),使程序執(zhí)行到這里時(shí)被掛起make不退出gdb就可以重新產(chǎn)生可執(zhí)行文件shell不離開(kāi)gdb就執(zhí)行UNIXshell命令(1) 源程序gdbtestl.c,分析程序的功能,如果出錯(cuò),要求用gdb進(jìn)行調(diào)試并給出修改方案?;静襟E:3)調(diào)試程序編譯:gcc-g-ogdbtestlgdbtestl.c運(yùn)行:./g

9、dbtestl開(kāi)始調(diào)試:gdbgdbtestl#include<stdio.h>intadd_range(intlow,inthigh)staticinti,sum;for(i=low;i<=high;i+)sum=sum+i;returnsum;intmain(void)intresult100;result0=add_range(1,10);result1=add_range(1,100);printf("result0=%dnresult1=%dn”,result0,result1);return0;源程序greet.c,功能:按照正序和逆序輸出給定的字符串。

10、要求用gdb進(jìn)行調(diào)試,分析出錯(cuò)的原因并給出修改方案。#include<stdio.h>#include<string.h>#include<malloc.h>voidmyprint(char*string);voidmy_print2(char*string);intmain()(charmy_string="hellothere"my_print(my_string);my_print2(my_string);return0;voidmy_print(char*string)(printf("Thestringis%sn”,s

11、tring);voidmy_print2(char*string)(char*string2;intsize,i;size=strlen(string);string2=(char*)malloc(size+1);for(i=0;i<size;i+)string2size-i=stringi;string2size+2='0'printf("Thestringprintedbackwardis%sn",string2);4、make的使用(1)用vi編輯以下程序,程序清單:main.cfunction1.hfunction1.cfunction2.hf

12、unction2.c/main.c#include"function1.h"#include"function2.h"intmain(intargc,char*argv)function1_print("hello");function2_print("world");return0;/function1.hvoidfunction1_print(char*str);/function1.c#include"function1.h"voidfunction1_print(char*str)printf("Thisisfunction1print%sn”,str);/function2.hvoidfunction2_print(char*str);/function2.c#include"function2.h"voidfunction2_print(char*str)printf("Thisisfunc

溫馨提示

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

評(píng)論

0/150

提交評(píng)論