版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn) 4-1Vi 使用實(shí)驗(yàn)?zāi)康?:學(xué)會(huì)用 vi編輯器實(shí)驗(yàn)要求:熟練使用該節(jié)所介紹的 vi創(chuàng)建、編輯、保存文件實(shí)驗(yàn)器材 :軟件:1.安裝了 Ubunt 的vmware 虛擬機(jī)硬件: PC機(jī)一臺(tái)實(shí)驗(yàn)步驟:1. 在當(dāng)前目錄下鍵入命令 vi hello.c 創(chuàng)建名為 hello.c 的文上圖是在命令行模式下2. 鍵入 i進(jìn)入插入模式3. 在插入模式下輸入文字hello word!4. 按Esc 鍵退出到命令行模式5. 按shift+; 鍵,即:鍵進(jìn)入底行模式6. 鍵入 wq保存退出7. 將文件 /etc/samba/smb.conf 拷貝到當(dāng)前目錄下, 下面的實(shí)驗(yàn)步驟是為了讓大家能夠熟練使用 vi中的
2、常見(jiàn)操作。命令: cp /etc/samba/smb.conf ./8. 用vi打開(kāi)文件 smb.conf ,設(shè)定顯示行號(hào),指出 “Share Definitiongs 的”所在行號(hào)在底行模式下,輸入: set nu 顯示行號(hào)這樣就可以看到 “Share Definitions 所在”的行為 246 行。9. 將光標(biāo)移動(dòng)到 248 行命令: 248G即在命令行模式下輸入 248shitf+g10. 復(fù)制改行以下 6行內(nèi)容命令: 6yy11. 將光標(biāo)移動(dòng)到最后一行行首命令: G,即 shift+g12. 粘貼復(fù)制的內(nèi)容命令: p13. 刪除12步粘貼的 6行命令: 6dd14. 撤銷(xiāo)第 13 步
3、的操作命令: u15. 查找字符串 “Share Definitions ” 命令: /Share Definitions16. 強(qiáng)制退出 vi,不存盤(pán)命令: q!17. 總結(jié):對(duì)vi編輯的使用必須非常的熟練,因?yàn)?vi編輯器是非常常用的。以后編輯程序、查看文檔、修改配置文件等操作都會(huì)用到,所以大家要多練習(xí)。實(shí)驗(yàn) 4-2Gcc 程序編譯實(shí)驗(yàn)?zāi)康?:學(xué)會(huì)使用 gcc編譯器及各種常用編譯選項(xiàng)的使用理解庫(kù)設(shè)計(jì)的功能:1) 代碼的封裝保密2) 代碼模塊化設(shè)計(jì)實(shí)驗(yàn)要求:1、編寫(xiě)一應(yīng)用程序,使用 gcc 進(jìn)行編譯,并分別使用-o,-g,-static,-o2 等選項(xiàng)2、靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的使用實(shí)驗(yàn)器材 :軟件
4、:安裝了 ubunt 12.4的vmware虛擬機(jī)硬件: PC機(jī)一臺(tái)第1題實(shí)驗(yàn)步驟:先用 vi編輯 hello.c 文件,內(nèi)容如下:int sum_int(int a, int b)return a+b;int main()int a=2,b=3,c;c=sum_int(a, b);printf(“sum of a and b is %dn”,c);目標(biāo)文件gcc 指令的一般格式為:gcc 選項(xiàng) 要編譯的文件選項(xiàng) 例:使用 gcc 編譯命令,編譯 hello.c 生成可執(zhí)行文件 hello ,并運(yùn)行 hello命令: #gcc hello.c o hello上面的命令一步由 .c 文件生成了可
5、執(zhí)行文件,將 gcc的四個(gè)編譯流程 :預(yù)處理、編譯、匯編、鏈接一步完成,下面將介紹四個(gè)流程分別做了什么工作。E選項(xiàng)的使用-E選項(xiàng)的作用:只進(jìn)行預(yù)處理,不做其他處理。例:只對(duì) hello.c 文件進(jìn)行預(yù)處理,生成文件 hello.i ,并查看命令: #gcc E hello.c o hello.i使用命令 #cathello.i 查看 hello.i 文件的內(nèi)容可以看到頭文件包含部分代碼 #include <stdio.h> 經(jīng)過(guò)預(yù)處理階段之后,編譯器已將 stdio.h 的內(nèi)容貼了進(jìn)來(lái)。S選項(xiàng)的使用-S選項(xiàng)的作用:只是編譯不匯編,生成匯編代碼例:將 hello.i 文件只進(jìn)行編譯而
6、不進(jìn)行匯編,生成匯編代碼hello.s命令: gcc S hello.i o hello.s使用命令 #cat hello.s 查看 hello.s 的類(lèi)容c選項(xiàng)的使用-c選項(xiàng)的作用:只是編譯不連接,生成目標(biāo)文件 “.o” 例:將匯編代碼 hello.s 只編譯不鏈接生成 hello.o 文件命令: #gcc c hello.s o hello.o使用 objdump -d hello.o命令查看反匯編代碼將編譯好了的 hello.o 鏈接庫(kù),生成可執(zhí)行文件hello命令: #gcc hello.o o hellstatic 選項(xiàng)的使用-static 選項(xiàng)的作用:鏈接靜態(tài)庫(kù)例:比較 hello
7、.c 鏈接動(dòng)態(tài)庫(kù)生成的可執(zhí)行文件 hello 和鏈接靜態(tài)庫(kù)生成的可執(zhí)行文件 hello1 的大小命令: #gcc hello.c o hello#gcc hello.c o static hello1可以看到靜態(tài)鏈接庫(kù)的可執(zhí)行文件 hello1 比動(dòng)態(tài)鏈接庫(kù)的可執(zhí)行文件 hello 要大的多,他們的執(zhí)行效果是一樣的。-g選項(xiàng)的使用-g 選項(xiàng)的作用:在可執(zhí)行程序中包含標(biāo)準(zhǔn)調(diào)試信息例:將 hello.c 編譯成包含標(biāo)準(zhǔn)調(diào)試信息的可執(zhí)行文件hello2命令: #gcc g hello.c o hello2帶有標(biāo)準(zhǔn)調(diào)試信息的可執(zhí)行文件可以使用 gdb調(diào)試器進(jìn)行調(diào)試,以便找出邏輯錯(cuò)誤。O2 選項(xiàng)的使用-
8、O2 選項(xiàng)的作用:完成程序的優(yōu)化工作。例:將 hello.c 是用 O2優(yōu)化選項(xiàng)編譯生成可執(zhí)行文件 hello1 ,和正常編譯產(chǎn)生的可執(zhí)行文件 hello 進(jìn)行比較2、實(shí)驗(yàn)步驟:1、建立 project 目錄,其子目錄結(jié)構(gòu)如下,2、在 src 文件夾編寫(xiě) main.c 主程序,參考代碼如下:編譯運(yùn)行,通過(guò),之后做如下調(diào)整:1) 在include 文件夾下新建頭文件 myhead.h, 將main.c 程序中,包含頭文件語(yǔ)句和函數(shù)聲明語(yǔ)句刪除并添加到 myhead.h中。在src 文件夾下編寫(xiě) sum.c 文件,將 main.c 程序函數(shù)的實(shí)現(xiàn)部分移動(dòng)到,sum.c 中。將 myhead.h 包
9、含到 main.c 中。myhead.h的參考代碼如下 :main.c的參考代碼如下:2) 目錄結(jié)構(gòu)如下:3) 由于頭文件 myhead.h與mian.c 不在用一個(gè)目錄下, 編譯時(shí)必須加入-I 選項(xiàng)來(lái)鏈接指定目錄的頭文件,gcc main.c sum.co main I./include/myhead.h4) 繼續(xù)修改代碼,將 sum.c 制作為靜態(tài)庫(kù) sum.a, 并將其保存到 lib 目錄中。并將 sum.c源程序剪切到桌面暫時(shí)保存。并且為了實(shí)驗(yàn)效果,將 lib 文件夾下用 touch 命令創(chuàng)建兩個(gè)庫(kù)文件。目錄結(jié)構(gòu)如下:靜態(tài)庫(kù)的制作及加載的一般方法如下:gcc sum.c -c -o s
10、um.o -I ./include/->先得到 *.o 的目標(biāo)文件(可重定位)ar -crs libsum.a add.o->通過(guò) ar 歸檔工具,將 add.o 生成靜態(tài)庫(kù)文件庫(kù)方法(庫(kù)加載方式): gcc main.c -o main -I ./include -L ./ -lsum -static- 靜態(tài)編譯(通過(guò) -static指定)-靜態(tài)編譯使用的是靜態(tài)庫(kù)-> libxxx.a編譯完成后運(yùn)行 main 程序,并嘗試將 main.c 拷貝到其它目錄下程序能否正確運(yùn)行,從而驗(yàn)證鏈接靜態(tài)庫(kù)生成的可執(zhí)行程序,程序在運(yùn)行時(shí),不依賴庫(kù),因?yàn)榫幾g時(shí)已經(jīng)將庫(kù)中的代碼添加到目標(biāo)文件中
11、了,并且系統(tǒng)默認(rèn)動(dòng)態(tài)編譯而不是靜態(tài)編譯。分析動(dòng)態(tài)庫(kù)的優(yōu)缺點(diǎn)并寫(xiě)到實(shí)驗(yàn)報(bào)告中:優(yōu)點(diǎn):執(zhí)行時(shí)不需要再額外加載,速度快缺點(diǎn):全部代碼被編譯進(jìn)程序,體積大5) 動(dòng)態(tài)庫(kù)的制作及鏈接方法:將保存的 sum.c 制作成動(dòng)態(tài)庫(kù)gcc sum.c -c -o sum.o -I ./include/->先得到 *.o 的目標(biāo)文件(可重定位)gcc -shared -fPIC sum.o -o libsum.so->生成位置無(wú)關(guān)的共享庫(kù)文件并將生成的動(dòng)態(tài)庫(kù) libsum.so ,移動(dòng)到 lib 目錄中庫(kù)加載方法:gcc main.c -o main -I ./include -L ./ -lsum生成可
12、執(zhí)行程序 main, 程序的運(yùn)行卻要依賴動(dòng)態(tài)庫(kù),原因及解決方法如下:程序編譯時(shí):需要加載對(duì)應(yīng)的庫(kù)文件,庫(kù)文件的位置?/lib/usr/lib如果所需的頭文件不在標(biāo)準(zhǔn)頭文件目錄,則需要通過(guò)-L選項(xiàng)指定->-L庫(kù)文件路徑-l指定庫(kù)文件名稱-> libadd.so ->-ladd動(dòng)態(tài)庫(kù)文件參與鏈接-運(yùn)行前,必須確保庫(kù)文件在準(zhǔn)確的庫(kù)文件加載路徑中,否則將提示加載失??!解決方法:1 ) 將庫(kù)文件拷貝到標(biāo)準(zhǔn)庫(kù)路徑(/lib/usr/lib)2 ) 確認(rèn)自定義生成的庫(kù)文件在自定義目錄中,如:/home/gec/project/lib修改環(huán)境變量 LD_LIBRARY_PATH ->
13、指定路徑 exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/gec/project/lib 如果想長(zhǎng)期有效,需要修改系統(tǒng)的配置文件,例如:/etc/bash.bashrc3 ) 修改系統(tǒng)的庫(kù)文件加載配置文件:在該文件中添加庫(kù)的新路徑( /home/gec/project/lib)使能:ldconfig理解動(dòng)態(tài)庫(kù)的優(yōu)缺點(diǎn):優(yōu)點(diǎn): 大部分加載的庫(kù)代碼不被編譯進(jìn)程序,只保留調(diào)用的信息符號(hào),在執(zhí)行時(shí)再調(diào)用,體積小缺點(diǎn):執(zhí)行時(shí)再額外加載, 速度慢;對(duì)運(yùn)行環(huán)境中庫(kù)文件有依賴 (必須在執(zhí)行的環(huán)境中有相應(yīng)的庫(kù)文件)知識(shí)點(diǎn):1、系統(tǒng)默認(rèn)動(dòng)態(tài)編譯,所謂動(dòng)態(tài)編譯,編譯器優(yōu)先鏈
14、接動(dòng)態(tài)庫(kù),只有在鏈接的動(dòng)態(tài)庫(kù)不存在的時(shí)候才會(huì)鏈接靜態(tài)庫(kù),除非自己指定是靜態(tài)編譯( -static )。2、動(dòng)態(tài)編譯時(shí),沒(méi)有對(duì)應(yīng)的動(dòng)態(tài)庫(kù),只有靜態(tài)庫(kù)->系統(tǒng)將靜態(tài)庫(kù)鏈接入程序,影響程序的體積等價(jià)于: 靜態(tài)庫(kù)中的代碼,直接加載到當(dāng)前文件,成為程序的一部分。實(shí)驗(yàn) 4-3GDB 程序調(diào)試實(shí)驗(yàn)?zāi)康?:學(xué)會(huì) gdb 調(diào)試器的使用實(shí)驗(yàn)要求:編寫(xiě)一應(yīng)用程序,使用 gdb 調(diào)試,調(diào)試中使用到該小結(jié)所介紹的所有命令實(shí)驗(yàn)器材 :軟件:1.安裝了 Ubunt 的vmware 虛擬機(jī)硬件: PC機(jī)一臺(tái)實(shí)驗(yàn)步驟:先用 vi編輯文件 test.c 用于 geb 調(diào)試器調(diào)試,內(nèi)容如下:將test.c 文件編程成包含標(biāo)準(zhǔn)
15、調(diào)試信息的文件test命令: #gcc g test.c o test啟動(dòng) gdb 進(jìn)行調(diào)試命令: gdb test可以看到 gcb 的啟動(dòng)界面中顯示了 gdb的版本、自由軟件等信息,然后進(jìn)入了由 “gdb”開(kāi)頭的命令行界面。l(list )命令l命令用于查看文件,如下圖:可以看到每行代碼前面都有對(duì)應(yīng)的行號(hào),這樣方便我們?cè)O(shè)置斷點(diǎn)。b(breakpoint )命令b用于設(shè)置斷點(diǎn),斷點(diǎn)調(diào)試是調(diào)試程序的一個(gè)非常重要的手段,設(shè)置方法:在 “b”命令之后加上對(duì)應(yīng)的行號(hào),如下圖:在gdb中可以設(shè)置多個(gè)斷點(diǎn)。 代碼運(yùn)行時(shí)會(huì)到斷點(diǎn)對(duì)應(yīng)的行之前暫停,上圖中,代碼就會(huì)運(yùn)行到第 7行之前暫停(并沒(méi)有運(yùn)行第 7行)。
16、info 命令info 命令用于查看斷點(diǎn)情況,設(shè)置好斷點(diǎn)后可以用它來(lái)查看,如下圖:r( run)命令r命令用于運(yùn)行代碼, 默認(rèn)是從首行開(kāi)始運(yùn)行, 也可以在 r后面加上行號(hào),從程序中指定行開(kāi)始運(yùn)行。可以看到程序運(yùn)行到斷點(diǎn)處就停止了。p(print )命令p命令用于查看變量的值, 在調(diào)試的時(shí)候我們經(jīng)常要查看某個(gè)變量當(dāng)前的值與我們邏輯設(shè)定的值是否相同,輸入 p+變量名即可,如下圖:可以看到 result 在第6行已被賦值為零,而 i目前還沒(méi)有被賦值所以是一個(gè)隨機(jī)數(shù),在主函數(shù)里看不到 num 的值,只有進(jìn)入子函數(shù)才能看到。s(step )命令s命令用于單步運(yùn)行,另外 n(next )命令也用于單步運(yùn)行
17、,它們的區(qū)別在于:如果有函數(shù)調(diào)用的時(shí)候, “s”會(huì)進(jìn)入該函數(shù)而“n”不會(huì)進(jìn)入該函數(shù)。下面是 s命令的使用:可以看到進(jìn)入了 sum 子函數(shù),這時(shí)候就能看到num 的值為100 。n(next )命令n命令用于單步運(yùn)行,下面是n命令的使用:和s命令的運(yùn)行效果對(duì)比會(huì)發(fā)現(xiàn),使用 n命令后,程序顯示函數(shù)sum 的運(yùn)行結(jié)果并向下執(zhí)行,而使用 s命令后則會(huì)進(jìn)入到 sum 函數(shù)之中單步運(yùn)行。finish 命令finish 命令用于運(yùn)行程序,直到當(dāng)前函數(shù)結(jié)束。例如我們進(jìn)入了sum 函數(shù),使用 finish 命令的情況:當(dāng)我們調(diào)試的時(shí)候如果覺(jué)得某個(gè)函數(shù)存在問(wèn)題,進(jìn)入函數(shù)體調(diào)試后發(fā)現(xiàn)問(wèn)題不在這個(gè)函數(shù),那么我們就可以
18、使用 finish 命令運(yùn)行程序,直到當(dāng)前函數(shù)結(jié)束。c命令c命令用于恢復(fù)程序的運(yùn)行, 例如我們?cè)谝粋€(gè)程序中設(shè)置了兩個(gè)斷點(diǎn),而覺(jué)得問(wèn)題不會(huì)出在這兩個(gè)斷點(diǎn)之間的代碼上。那么我們可以在查看完第一個(gè)斷點(diǎn)的變量及堆棧情況后, 使用 c 命令恢復(fù)程序的正常運(yùn)行,代碼就會(huì)停在第二個(gè)斷點(diǎn)處。q(quit) 命令q命令用于退出 gdb 調(diào)試器實(shí)驗(yàn) 5-2Makefile實(shí)驗(yàn)?zāi)康?:學(xué)會(huì)編寫(xiě) Makefile實(shí)驗(yàn)要求:實(shí)現(xiàn)一應(yīng)用程序, 該程序由兩個(gè) c文件構(gòu)成,使用 makefile 來(lái)完成該程序的編譯實(shí)驗(yàn)器材 :軟件:安裝了 Ubunt 的vmware 虛擬機(jī)硬件: PC機(jī)一臺(tái)實(shí)驗(yàn)步驟:一、先用 vi編輯一個(gè)簡(jiǎn)單的 c程序,由兩個(gè)文件組成,文件 fun.c 內(nèi)容文件 main.c 的內(nèi)容文件 fun.h 的內(nèi)容使用 gcc 編譯命令直接編譯出可執(zhí)行文件 main ,并運(yùn)行查看結(jié)果。命令: #gcc fun.c main.co main用vi編輯 makefile ,內(nèi)容如下所示:退出并保存,在 shell 中鍵入 make ,查看并運(yùn)行產(chǎn)生的可執(zhí)行文件 main :用 vi打開(kāi) makefile 進(jìn)行改寫(xiě),用變量進(jìn)行替換,經(jīng)變量替換后的 makefile 如下所示:退出保存后,在shell 中
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度場(chǎng)營(yíng)銷(xiāo)分公司智慧城市項(xiàng)目合作協(xié)議3篇
- 二零二五版商業(yè)街區(qū)場(chǎng)地租賃合作協(xié)議書(shū)6篇
- 2025年度高新技術(shù)產(chǎn)業(yè)常年法律顧問(wèn)聘用協(xié)議3篇
- 二零二五年度企業(yè)稅收籌劃與稅收籌劃實(shí)施合同3篇
- 二零二五年度出口退稅證明開(kāi)具及國(guó)際金融服務(wù)合同3篇
- 二零二五年度港口碼頭租賃及港口貨物裝卸、倉(cāng)儲(chǔ)及配送服務(wù)協(xié)議8篇
- 二零二五年度土地承包經(jīng)營(yíng)權(quán)糾紛調(diào)解合同-@-2
- 2025草原禁牧與水資源保護(hù)管理協(xié)議合同3篇
- 2025年度個(gè)人個(gè)人借款合同信用評(píng)估標(biāo)準(zhǔn)3篇
- 二零二五食用油產(chǎn)品包裝設(shè)計(jì)與印刷合同
- 中考模擬考試化學(xué)試卷與答案解析(共三套)
- 新人教版五年級(jí)小學(xué)數(shù)學(xué)全冊(cè)奧數(shù)(含答案)
- 風(fēng)電場(chǎng)升壓站培訓(xùn)課件
- 收納盒注塑模具設(shè)計(jì)(論文-任務(wù)書(shū)-開(kāi)題報(bào)告-圖紙)
- 博弈論全套課件
- CONSORT2010流程圖(FlowDiagram)【模板】文檔
- 腦電信號(hào)處理與特征提取
- 高中數(shù)學(xué)知識(shí)點(diǎn)全總結(jié)(電子版)
- GB/T 10322.7-2004鐵礦石粒度分布的篩分測(cè)定
- 2023新譯林版新教材高中英語(yǔ)必修一重點(diǎn)詞組歸納總結(jié)
- 蘇教版四年級(jí)數(shù)學(xué)下冊(cè)第3單元第2課時(shí)“常見(jiàn)的數(shù)量關(guān)系”教案
評(píng)論
0/150
提交評(píng)論