實(shí)驗(yàn)三Linux系統(tǒng)下C編程課件.pptx_第1頁(yè)
實(shí)驗(yàn)三Linux系統(tǒng)下C編程課件.pptx_第2頁(yè)
實(shí)驗(yàn)三Linux系統(tǒng)下C編程課件.pptx_第3頁(yè)
實(shí)驗(yàn)三Linux系統(tǒng)下C編程課件.pptx_第4頁(yè)
實(shí)驗(yàn)三Linux系統(tǒng)下C編程課件.pptx_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 Linux系統(tǒng)下C編程 文字編輯器vi 主要內(nèi)容和要求一.了解vi編輯器的作用和功能二.熟悉vi的操作環(huán)境和切換方法三.掌握vi操作的方式(幾個(gè)常用鍵)四.了解常用的快捷鍵一.vi編輯器概述 vi編輯器是各種UNIX/Linux系統(tǒng)都會(huì)支持的全屏幕文字編輯器,與Windows下的文字編輯器相比,vi的使用要麻煩一些,但功能強(qiáng)大,并且是UNIX/Linux缺省編輯器。任何一位UNIX/Linux系統(tǒng)管理者都應(yīng)該學(xué)會(huì)用vi。 vi的操作環(huán)境是針對(duì)熟悉UNIX系統(tǒng)的使用者而設(shè)計(jì),初學(xué)者必須多加練習(xí)。 二.vi的操作環(huán)境和切換方法vi 共分為三種模式(1)命令模式:命令模式為vi的初始模式,可以使用

2、“上下左右”按鍵來(lái)移動(dòng)光標(biāo),您可以使用“刪除字符”或“刪除整行”來(lái)處理文檔。在編輯模式或指令列模式中按【ESC】鍵可換回命令模式。(2)編輯模式:在命令模式中按下【i, I, o, O, a, A, r, R】等字母之后才會(huì)進(jìn)入編輯模式。按下上述的字母時(shí),在畫(huà)面的左下方會(huì)出現(xiàn)【 -INSERT- 或 -插入- 】的字樣,才可以做文字?jǐn)?shù)據(jù)輸入。 (3)指令列模式:在命令模式當(dāng)中,輸入 【:】或【 / 】就可以將光標(biāo)移動(dòng)到最底下那一行,進(jìn)入指令列模式。在這個(gè)模式當(dāng)中,可以存盤(pán)、結(jié)束vi 、顯示行號(hào)等操作。 二.vi的操作環(huán)境和切換方法命令模式編輯模式指令列模式按i, I, o, O, a, A,

3、r, R按 : 或 / 按ESC三.掌握vi操作的方式(幾個(gè)常用鍵)進(jìn)入vi開(kāi)始編輯:$vi 新文件名例如:$vi newfile (打開(kāi)名為newfile的舊文檔,或新編一個(gè)名為newfile的新文檔) 剛開(kāi)啟vi時(shí)為命令模式,按下【i, I, o, O, a, A, r, R】等字母之后會(huì)進(jìn)入編輯模式。 編輯完畢按下【ESC】返回命令模式操作;在命令模式中按下【:】或【/】可進(jìn)入指令列模式。 在指令列模式中(有【:】提示時(shí)),可輸入w(存檔)、q(離開(kāi)vi)、wq(存檔并離開(kāi)vi)、q!(不存檔離開(kāi)vi)、h或help(在線說(shuō)明)、以及其它搜尋取代等指令。再按【ESC】回到命令模式。即:

4、:w- 將編輯的文本存盤(pán)。:w!- 若文件屬性為“只讀”時(shí),強(qiáng)制存盤(pán):q- 退出 vi :q!-退出且不存盤(pán)。:wq-存盤(pán)并退出主要內(nèi)容gcc簡(jiǎn)介功能命令安裝利用gcc編譯c程序利用make工具簡(jiǎn)化編譯過(guò)程make簡(jiǎn)介Makefile基本格式調(diào)試靜態(tài)調(diào)試動(dòng)態(tài)調(diào)試gdb調(diào)試工具的使用gcc簡(jiǎn)介簡(jiǎn)介: Linux系統(tǒng)下的gcc(GNU C Compiler)是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平臺(tái)上編譯出可執(zhí)行程序的超級(jí)編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%30%。 安裝 首先查看linux系統(tǒng)是否安裝了gcc, #rpm

5、qa|grep gcc 如果沒(méi)有安裝,需要安裝gcc-3.2.2-5,libgcc-3.2.2,compat-gcc-7.3-2.96.118,gcc-g77-3.2.2-5幾個(gè)軟件包。對(duì)C/C+編譯的控制(GCC的編譯過(guò)程)預(yù)處理(Preprocessing)gcc首先調(diào)用cpp進(jìn)行預(yù)處理,在預(yù)處理過(guò)程中,對(duì)源代碼文件中的文件包含(include)、預(yù)編譯語(yǔ)句(如宏定義define等)進(jìn)行分析。 編譯(Compilation)Gcc調(diào)用cc1進(jìn)行編譯,這個(gè)階段根據(jù)輸入文件生成匯編語(yǔ)言。 匯編(Assembly)Gcc調(diào)用as進(jìn)行工作,一般來(lái)講,.S為后綴的匯編語(yǔ)言源代碼文件和匯編、.s為后綴

6、的匯編語(yǔ)言文件經(jīng)過(guò)預(yù)編譯和匯編之后都生成以.o為后綴的目標(biāo)文件。 鏈接(Linking )Gcc調(diào)用ld來(lái)完成連接工作,生成可執(zhí)行文件。 gcc的使用基本使用格式 $ gcc 選項(xiàng) 常用選項(xiàng)及含義gcc常用選項(xiàng)選項(xiàng)含義-o file將經(jīng)過(guò)gcc處理過(guò)的結(jié)果存為文件file,這個(gè)結(jié)果文件可能是預(yù)處理文件、匯編文件、目標(biāo)文件或者最終的可執(zhí)行文件。假設(shè)被處理的源文件為source.suffix,如果這個(gè)選項(xiàng)被省略了,那么生成的可執(zhí)行文件默認(rèn)名稱為a.out;目標(biāo)文件默認(rèn)名為source.o;匯編文件默認(rèn)名為source.s;生成的預(yù)處理文件則發(fā)送到標(biāo)準(zhǔn)輸出設(shè)備。gcc的常用選項(xiàng)gcc常用選項(xiàng)選項(xiàng)含義

7、-c僅對(duì)源文件進(jìn)行編譯,不鏈接生成可執(zhí)行文件。在對(duì)源文件進(jìn)行查錯(cuò)時(shí),或只需產(chǎn)生目標(biāo)文件時(shí)可以使用該選項(xiàng)。-ggdb在可執(zhí)行文件中加入調(diào)試信息,方便進(jìn)行程序的調(diào)試。如果使用中括號(hào)中的選項(xiàng),表示加入gdb擴(kuò)展的調(diào)試信息,方便使用gdb來(lái)進(jìn)行調(diào)試-O0、1、2、3對(duì)生成的代碼使用優(yōu)化,中括號(hào)中的部分為優(yōu)化級(jí)別,缺省的情況為2級(jí)優(yōu)化,0為不進(jìn)行優(yōu)化。注意,采用更高級(jí)的優(yōu)化并不一定得到效率更高的代碼。-Dname=definition將名為name的宏定義為definition,如果中括號(hào)中的部分缺省,則宏被定義為1gcc的常用選項(xiàng)gcc常用選項(xiàng)選項(xiàng)含義-Idir在編譯源程序時(shí)增加一個(gè)搜索頭文件的額外目

8、錄dir,即include增加一個(gè)搜索的額外目錄。-Ldir在編譯源文件時(shí)增加一個(gè)搜索庫(kù)文件的額外目錄dir-llibrary在編譯鏈接文件時(shí)增加一個(gè)額外的庫(kù),庫(kù)名為library.a-w禁止所有警告-Wwarning允許產(chǎn)生warning類型的警告,warning可以是:main、unused等很多取值,最常用是-Wall,表示產(chǎn)生所有警告。如果warning取值為error,其含義是將所有警告作為錯(cuò)誤(error),即出現(xiàn)警告就停止編譯。gcc文件擴(kuò)展名規(guī)范 gcc可以根據(jù)文件擴(kuò)展名執(zhí)行操作gcc文件擴(kuò)展名規(guī)范擴(kuò)展名類型可進(jìn)行的操作方式.cc語(yǔ)言源程序預(yù)處理、編譯、匯編、鏈接.C,.cc,

9、.cp,.cpp,.c+,.cxxc+語(yǔ)言源程序預(yù)處理、編譯、匯編、鏈接.i預(yù)處理后的c語(yǔ)言源程序編譯、匯編、鏈接.ii預(yù)處理后的c+語(yǔ)言源程序編譯、匯編、鏈接.s預(yù)處理后的匯編程序匯編、鏈接.S未預(yù)處理的匯編程序預(yù)處理、匯編、鏈接.h頭文件不進(jìn)行任何操作.o目標(biāo)文件鏈接使用gcc編譯代碼源代碼示例源程序hello.c#include int main(void)printf(hello gcc!rn);return 0;生成預(yù)處理文件命令$gcc E hello.c o hello.i預(yù)處理文件hello.i的部分內(nèi)容.extern void funlockfile (FILE *_stre

10、am) ;# 679 /usr/include/stdio.h 3# 2 hello.c 2int main(void) printf(hello gcc!n); return 0;生成匯編文件命令$gcc S hello.c o hello.s匯編文件hello.s的部分內(nèi)容.main:pushl%ebpmovl%esp, %ebp.addl$16, %espmovl$0, %eaxleaveret.編譯多個(gè)文件文件清單greeting.h #ifndef _GREETING_H #define _GREETING_Hvoid greeting (char * name);#endif gr

11、eeting.c #include #include greeting.hvoid greeting (char * name)printf(Hello %s!rn,name); my_app.c #include #include greeting.h#define N 10int main(void)char nameN; printf(Your Name,Please:); scanf(%s,name); greeting(name); return 0; 生成二進(jìn)制文件生成目標(biāo)文件命令:$gcc c hello.c o hello.o生成可執(zhí)行文件命令:$gcc hello.c o h

12、ello運(yùn)行程序$./hellohello gcc!編譯多個(gè)文件目錄結(jié)構(gòu)(1)編譯命令$ gcc my_app.c greeting.c o my_app目錄結(jié)構(gòu)(2)編譯方式(1)$gcc my_app.c functions/greeting.c o my_app -I functionsgreeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions編譯多個(gè)文件目錄結(jié)構(gòu)(2)編譯方式(2)分步編譯命令:1、$gcc -c my_app.c -Ifunctions 2、$gcc -c functions/greeti

13、ng.c3、$gcc my_app.o greeting.o o my_app思路:編譯每一個(gè).c文件,得到.o的目標(biāo)文件;將每一個(gè).o的目標(biāo)文件鏈接成一個(gè)可執(zhí)行的文件;使用make工具適用場(chǎng)合:多個(gè)文件組成的軟件項(xiàng)目基本格式:目標(biāo):欲生成的目標(biāo)文件依賴項(xiàng):生成目標(biāo)需要的文件原理:判斷依賴項(xiàng)是否為最新,否則,生成新的目標(biāo)make工具的使用格式:make 命令選項(xiàng) 命令參數(shù)通常使用make就可以了,make會(huì)尋找Makefile作為編譯指導(dǎo)文件;目標(biāo):依賴項(xiàng)列表(Tab縮進(jìn))命令使用make工具M(jìn)akefile示例Makefile文件1my_app:greeting.o my_app.o2gcc

14、 my_app.o greeting.o -o my_app3greeting.o:functions/greeting.c functions/greeting.h4gcc -c functions/greeting.c5my_app.o:my_app.c functionsgreeting.h6gcc c my_app.c Ifunctions使用make工具目標(biāo)的依賴關(guān)系my_appmy_app.ogreeting.omy_app.cfunctionsgreeting.hfunctionsgreeting.cgcc c my_app.c Ifunctions gcc -c functio

15、nsgreeting.c gcc my_app.o greeting.o -o my_app 使用make工具更實(shí)用的Makefile更實(shí)用的Makefile文件1OBJS = greeting.o my_app.o2CC = gcc3CFLAGS = -Wall -O g4my_app:$OBJS5$CC $OBJS -o my_app6greeting.o:functions/greeting.c functions/greeting.h7$CC $CFLAGS -c functions/greeting.c8my_app.o:my_app.c functions/greeting.h9$

16、CC $CFLAGS -c my_app.c -Ifunctions調(diào)試調(diào)試靜態(tài)調(diào)試:在程序編譯階段查錯(cuò)并修正錯(cuò)誤;主要為語(yǔ)法錯(cuò)誤:輸入錯(cuò)誤;類型匹配錯(cuò)誤;排錯(cuò)方式:利用錯(cuò)誤、警告信息,并結(jié)合源文件環(huán)境排錯(cuò)動(dòng)態(tài)調(diào)試:在程序運(yùn)行階段差錯(cuò)并修正錯(cuò)誤;主要錯(cuò)誤類型:算法錯(cuò)誤;輸入錯(cuò)誤;排錯(cuò)方式:利用調(diào)試工具定位并修正錯(cuò)誤;調(diào)試舉例源文件greeting.h #ifndef _GREETING_H #define _GREETING_Hvoid greeting (char * name);#endif greeting.c #include #include greeting.hvoid greet

17、ing (char * name)printf(Hello !rn); my_app.c 1#include 2#include greeting.h3#define N 104int main(void)56char namen; 7printf(Your Name,Please:); 8scanf(%s,name)9greeting(name); 10/*return 0;*/ 11 靜態(tài)調(diào)試舉例分塊編譯greeting.c$gcc -g -Wall -c functions/greeting.c-g:將調(diào)試信息加入到編譯的目標(biāo)文件中 ;-Wall:將編譯過(guò)程中的所有級(jí)別的警告都打印出來(lái)

18、;無(wú)錯(cuò)誤my_app.c$gcc -g -Wall -c my_app.c -Ifunctions參數(shù)含義同上錯(cuò)誤信息:調(diào)試舉例錯(cuò)誤信息:錯(cuò)誤記錄格式:文件名:行號(hào):錯(cuò)誤描述my_app.c: In function main:my_app.c:6: n undeclared (first use in this function)my_app.c:6: (Each undeclared identifier is reported only oncemy_app.c:6: for each function it appears in.)my_app.c:9: parse error bef

19、ore greetingmy_app.c:6: warning: unused variable name靜態(tài)調(diào)試舉例分析、定位錯(cuò)誤(警告):my_app.c的第6行:描述含義:n是一個(gè)沒(méi)有聲明的變量;分析:聲明數(shù)字name時(shí)用到了變量n,但變量n在之前沒(méi)有聲明;改正:聲明一個(gè)新變量n;或者將n改為宏N這里取第2種改正方法;靜態(tài)調(diào)試舉例my_app.c的第9行:描述含義:在“greeting”之前出現(xiàn)解析錯(cuò)誤;分析:c中每行程序以;結(jié)束,第9行g(shù)reeting之前的程序行沒(méi)有以;結(jié)束;改正:第8行末尾增加“;”重新編譯錯(cuò)誤信息:my_app.c: In function main:my_app

20、.c:11: warning: control reaches end of non-void function靜態(tài)調(diào)試舉例分析、定位錯(cuò)誤(警告):警告:my_app.c的11行描述含義:控制以非空函數(shù)結(jié)束;分析:main函數(shù)返回類型為int,源程序沒(méi)有以return 整數(shù)形式結(jié)束;改正:將main改為返回void類型;或者:在main程序后增加return 返回語(yǔ)句;采用第2種解決方式;重新編譯,無(wú)錯(cuò)誤或警告信息,完成靜態(tài)調(diào)試靜態(tài)調(diào)試舉例靜態(tài)調(diào)試總結(jié)主要為語(yǔ)法錯(cuò)誤:輸入錯(cuò)誤;類型匹配錯(cuò)誤;分析信息:主要來(lái)自gcc編譯時(shí)產(chǎn)生的提示信息錯(cuò)誤警告定位:不一定在提示信息描述的地方;綜合分析提示信息及

21、提示行的上下文環(huán)境,定位并修正錯(cuò)誤、警告。有的警告可以不用修復(fù);動(dòng)態(tài)調(diào)試舉例 常見(jiàn)的動(dòng)態(tài)調(diào)試方法:增加調(diào)試語(yǔ)句 ;記錄程序的執(zhí)行狀況 ;觀察內(nèi)存變化 ;使用調(diào)試工具;GNU Debuger的功能:?jiǎn)?dòng)程序,設(shè)置程序執(zhí)行的上下文環(huán)境;在指定的條件下停止程序;程序停止時(shí),檢查程序的狀態(tài);在程序運(yùn)行時(shí),改變程序狀態(tài),使其按照改變后的狀態(tài)繼續(xù)執(zhí)行。動(dòng)態(tài)調(diào)試舉例gdb常用的調(diào)試命令命令含義file指定需要進(jìn)行調(diào)試的程序step單步(行)執(zhí)行,如果遇到函數(shù)會(huì)進(jìn)入函數(shù)內(nèi)部next單步(行)執(zhí)行,如果遇到函數(shù)不會(huì)進(jìn)入函數(shù)內(nèi)部run啟動(dòng)被執(zhí)行的程序quit退出gdb調(diào)試環(huán)境print查看變量或者表達(dá)式的值bre

22、ak設(shè)置斷點(diǎn),程序執(zhí)行到斷點(diǎn)就會(huì)暫停起來(lái)shell執(zhí)行其后的shell命令list查看指定文件或者函數(shù)的源代碼,并標(biāo)出行號(hào)動(dòng)態(tài)調(diào)試舉例對(duì)靜態(tài)調(diào)試中的例子繼續(xù)進(jìn)行動(dòng)態(tài)調(diào)試工具:gdb啟動(dòng)gdb$gdbGNU gdb Red Hat Linux (5.3post-0.20021129.18rh)Copyright 2003 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distr

23、ibute 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.This GDB was configured as i386-redhat-linux-gnu.(gdb)啟動(dòng)命令啟動(dòng)提示啟動(dòng)完畢動(dòng)態(tài)調(diào)試舉例調(diào)試指定程序(./my_app)問(wèn)題:期望的輸出和實(shí)際輸出不一致(gdb) file ./my_appReading symbols from

24、./my_app.done(gdb) runStarting program: /home/tom/shell_script/cpp/my_app/my_appYour Name,Please:tomHello !Program exited normally.(gdb)加載調(diào)試程序啟動(dòng)調(diào)試程序程序輸出提示信息動(dòng)態(tài)調(diào)試舉例初次錯(cuò)誤定位:輸出有錯(cuò)誤錯(cuò)誤定位重新開(kāi)始一次調(diào)試;啟動(dòng)gdb;加載調(diào)試程序(./my_app);查看程序源代碼命令:list 文件名動(dòng)態(tài)調(diào)試舉例(gdb) list my_app.c:1,201#include 2#include greeting.h3#define N 104int main(void)56char nameN;7printf(Your Name,Please:);8scanf(%s,name);9greeting(nam

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論