嵌入式Linux操作系統(tǒng)實(shí)驗(yàn)4_第1頁
嵌入式Linux操作系統(tǒng)實(shí)驗(yàn)4_第2頁
嵌入式Linux操作系統(tǒng)實(shí)驗(yàn)4_第3頁
嵌入式Linux操作系統(tǒng)實(shí)驗(yàn)4_第4頁
嵌入式Linux操作系統(tǒng)實(shí)驗(yàn)4_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)4-1 Vi使用l 實(shí)驗(yàn)?zāi)康模簩W(xué)會(huì)用vi編輯器l 實(shí)驗(yàn)要求:熟練使用該節(jié)所介紹的vi創(chuàng)建、編輯、保存文件l 實(shí)驗(yàn)器材:軟件:1.安裝了Ubunt的vmware虛擬機(jī)硬件:PC機(jī)一臺(tái)l 實(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中的常見操作。命令:cp /

2、etc/samba/smb.conf ./8. 用vi打開文件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. 撤銷第13步的操作命令:u15. 查找字符串“Share Definitions”命

3、令:/Share Definitions16. 強(qiáng)制退出vi,不存盤命令:q!17. 總結(jié):對(duì)vi編輯的使用必須非常的熟練,因?yàn)関i編輯器是非常常用的。以后編輯程序、查看文檔、修改配置文件等操作都會(huì)用到,所以大家要多練習(xí)。實(shí)驗(yàn)4-2 Gcc程序編譯· 實(shí)驗(yàn)?zāi)康模簩W(xué)會(huì)使用gcc編譯器及各種常用編譯選項(xiàng)的使用理解庫設(shè)計(jì)的功能: 1)代碼的封裝保密 2)代碼模塊化設(shè)計(jì)· 實(shí)驗(yàn)要求:1、 編寫一應(yīng)用程序,使用gcc進(jìn)行編譯,并分別使用-o,-g,-static,-o2等選項(xiàng)2、 靜態(tài)庫和動(dòng)態(tài)庫的使用· 實(shí)驗(yàn)器材:軟件:安裝了ubunt 12.4的vmware虛擬機(jī)硬件:P

4、C機(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);gcc指令的一般格式為:gcc 選項(xiàng) 要編譯的文件 選項(xiàng) 目標(biāo)文件例:使用gcc編譯命令,編譯hello.c生成可執(zhí)行文件hello,并運(yùn)行hello命令:#gcc hello.c o hello上面的命令一步由.c文件生成了可執(zhí)行文件,將gcc的四個(gè)編譯流程:預(yù)處理、編譯、匯編

5、、鏈接一步完成,下面將介紹四個(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使用命令#cat hello.i查看 hello.i文件的內(nèi)容可以看到頭文件包含部分代碼#include <stdio.h>經(jīng)過預(yù)處理階段之后,編譯器已將stdio.h的內(nèi)容貼了進(jìn)來。· S選項(xiàng)的使用-S選項(xiàng)的作用:只是編譯不匯編,生成匯編代碼例:將hello.i文件只進(jìn)行編譯而不進(jìn)行匯編,生成匯編代碼hello.s命令:gcc S

6、 hello.i o hello.s使用命令#cat hello.s查看hello.s的類容· 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鏈接庫,生成可執(zhí)行文件hello命令:#gcc hello.o o hell· static選項(xiàng)的使用-static選項(xiàng)的作用:鏈接靜態(tài)庫例:比較hello.c鏈接動(dòng)態(tài)庫生成的可執(zhí)行文件hello和鏈接靜

7、態(tài)庫生成的可執(zhí)行文件hello1的大小命令:#gcc hello.c o hello #gcc hello.c o static hello1可以看到靜態(tài)鏈接庫的可執(zhí)行文件hello1比動(dòng)態(tài)鏈接庫的可執(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)的使用-O2選項(xiàng)的作用:完成程序的優(yōu)化工作。例:將hell

8、o.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文件夾編寫main.c主程序,參考代碼如下:編譯運(yùn)行,通過,之后做如下調(diào)整:1) 在include文件夾下新建頭文件myhead.h,將main.c程序中,包含頭文件語句和函數(shù)聲明語句刪除并添加到myhead.h中。在src 文件夾下編寫sum.c 文件,將main.c程序函數(shù)的實(shí)現(xiàn)部分移動(dòng)到,sum.c中。將myhead.h 包含到 main.c中。myhead.h的參考代碼如下:main.c 的參考代碼如下:

9、2) 目錄結(jié)構(gòu)如下:3) 由于頭文件myhead.h與mian.c不在用一個(gè)目錄下,編譯時(shí)必須加入-I 選項(xiàng)來鏈接指定目錄的頭文件,gcc main.c sum.c o main I./include/myhead.h4) 繼續(xù)修改代碼,將sum.c 制作為靜態(tài)庫sum.a,并將其保存到lib目錄中。并將sum.c源程序剪切到桌面暫時(shí)保存。并且為了實(shí)驗(yàn)效果,將lib文件夾下用touch命令創(chuàng)建兩個(gè)庫文件。目錄結(jié)構(gòu)如下:靜態(tài)庫的制作及加載的一般方法如下:gcc sum.c -c -o sum.o -I ./include/ -> 先得到*.o的目標(biāo)文件(可重定位) ar -crs libs

10、um.a add.o -> 通過ar歸檔工具,將add.o生成靜態(tài)庫文件 庫方法(庫加載方式): gcc main.c -o main -I ./include -L ./ -lsum -static-靜態(tài)編譯(通過 -static 指定)-靜態(tài)編譯使用的是靜態(tài)庫-> libxxx.a編譯完成后運(yùn)行main 程序,并嘗試將main.c拷貝到其它目錄下程序能否正確運(yùn)行,從而驗(yàn)證鏈接靜態(tài)庫生成的可執(zhí)行程序,程序在運(yùn)行時(shí),不依賴庫,因?yàn)榫幾g時(shí)已經(jīng)將庫中的代碼添加到目標(biāo)文件中了,并且系統(tǒng)默認(rèn)動(dòng)態(tài)編譯而不是靜態(tài)編譯。分析動(dòng)態(tài)庫的優(yōu)缺點(diǎn)并寫到實(shí)驗(yàn)報(bào)告中:優(yōu)點(diǎn):執(zhí)行時(shí)不需要再額外加載,速度快缺點(diǎn)

11、:全部代碼被編譯進(jìn)程序,體積大5) 動(dòng)態(tài)庫的制作及鏈接方法: 將保存的sum.c 制作成動(dòng)態(tài)庫gcc sum.c -c -o sum.o -I ./include/ -> 先得到*.o的目標(biāo)文件(可重定位) gcc -shared -fPIC sum.o -o libsum.so -> 生成位置無關(guān)的共享庫文件并將生成的動(dòng)態(tài)庫libsum.so,移動(dòng)到lib目錄中庫加載方法: gcc main.c -o main -I ./include -L ./ -lsum生成可執(zhí)行程序main,程序的運(yùn)行卻要依賴動(dòng)態(tài)庫,原因及解決方法如下: 程序編譯時(shí): 需要加載對(duì)應(yīng)的庫文件,庫文件的位置?

12、 /lib /usr/lib 如果所需的頭文件不在標(biāo)準(zhǔn)頭文件目錄,則需要通過 -L 選項(xiàng)指定 -> -L 庫文件路徑 -l 指定庫文件名稱 -> libadd.so -> -ladd 動(dòng)態(tài)庫文件參與鏈接- 運(yùn)行前,必須確保庫文件在準(zhǔn)確的庫文件加載路徑中,否則將提示加載失敗! 解決方法: 1) 將庫文件拷貝到標(biāo)準(zhǔn)庫路徑(/lib /usr/lib ) 2) 確認(rèn)自定義生成的庫文件在自定義目錄中,如:/home/gec/project/lib 修改環(huán)境變量 LD_LIBRARY_PATH -> 指定路徑 export LD_LIBRARY_PATH=$LD_LIBRARY_

13、PATH:/home/gec/project/lib 如果想長(zhǎng)期有效,需要修改系統(tǒng)的配置文件,例如: /etc/bash.bashrc 3) 修改系統(tǒng)的庫文件加載配置文件: /etc/ld.so.conf -> 在該文件中添加庫的新路徑(/home/gec/project/lib) 使能: ldconfig 理解動(dòng)態(tài)庫的優(yōu)缺點(diǎn):優(yōu)點(diǎn): 大部分加載的庫代碼不被編譯進(jìn)程序,只保留調(diào)用的信息符號(hào),在執(zhí)行時(shí)再調(diào)用,體積小缺點(diǎn):執(zhí)行時(shí)再額外加載,速度慢;對(duì)運(yùn)行環(huán)境中庫文件有依賴(必須在執(zhí)行的環(huán)境中有相應(yīng)的庫文件)知識(shí)點(diǎn):1、 系統(tǒng)默認(rèn)動(dòng)態(tài)編譯,所謂動(dòng)態(tài)編譯,編譯器優(yōu)先鏈接動(dòng)態(tài)庫,只有在鏈接的動(dòng)態(tài)庫

14、不存在的時(shí)候才會(huì)鏈接靜態(tài)庫,除非自己指定是靜態(tài)編譯(-static)。2、 動(dòng)態(tài)編譯時(shí),沒有對(duì)應(yīng)的動(dòng)態(tài)庫,只有靜態(tài)庫-> 系統(tǒng)將靜態(tài)庫鏈接入程序,影響程序的體積 等價(jià)于:靜態(tài)庫中的代碼,直接加載到當(dāng)前文件,成為程序的一部分。實(shí)驗(yàn)4-3 GDB程序調(diào)試· 實(shí)驗(yàn)?zāi)康模簩W(xué)會(huì)gdb調(diào)試器的使用· 實(shí)驗(yàn)要求:編寫一應(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

15、.c文件編程成包含標(biāo)準(zhǔn)調(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”開頭的命令行界面。· 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)行到

16、第7行之前暫停(并沒有運(yùn)行第7行)。· info命令info命令用于查看斷點(diǎn)情況,設(shè)置好斷點(diǎn)后可以用它來查看,如下圖:· r(run)命令r命令用于運(yùn)行代碼,默認(rèn)是從首行開始運(yùn)行,也可以在r后面加上行號(hào),從程序中指定行開始運(yùn)行??梢钥吹匠绦蜻\(yùn)行到斷點(diǎn)處就停止了。· p(print)命令p命令用于查看變量的值,在調(diào)試的時(shí)候我們經(jīng)常要查看某個(gè)變量當(dāng)前的值與我們邏輯設(shè)定的值是否相同,輸入p+變量名即可,如下圖:可以看到result在第6行已被賦值為零,而i目前還沒有被賦值所以是一個(gè)隨機(jī)數(shù),在主函數(shù)里看不到num的值,只有進(jìn)入子函數(shù)才能看到。· s(step)命

17、令s命令用于單步運(yùn)行,另外n(next)命令也用于單步運(yùn)行,它們的區(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í)候如果覺得某個(gè)函數(shù)存在問題,

18、進(jìn)入函數(shù)體調(diào)試后發(fā)現(xiàn)問題不在這個(gè)函數(shù),那么我們就可以使用finish命令運(yùn)行程序,直到當(dāng)前函數(shù)結(jié)束。· c命令c命令用于恢復(fù)程序的運(yùn)行,例如我們?cè)谝粋€(gè)程序中設(shè)置了兩個(gè)斷點(diǎ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-2 Makefile· 實(shí)驗(yàn)?zāi)康模簩W(xué)會(huì)編寫Makefile· 實(shí)驗(yàn)要求:實(shí)現(xiàn)一應(yīng)用程序,該程序由兩個(gè)c文件構(gòu)成,使用makefile來完成該程序的編譯· 實(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.c o main· 用vi編輯makefile,內(nèi)容如下所示:· 退出并保存,在shell中鍵入make,查看并運(yùn)行產(chǎn)生的可執(zhí)行文件main:· 用vi打開makefile進(jìn)行改寫,用變量進(jìn)行替換,經(jīng)變量替換后的makefile如下所示:退出保存后,

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔