Linux基礎(chǔ)-源代碼的編譯和調(diào)試_第1頁(yè)
Linux基礎(chǔ)-源代碼的編譯和調(diào)試_第2頁(yè)
Linux基礎(chǔ)-源代碼的編譯和調(diào)試_第3頁(yè)
Linux基礎(chǔ)-源代碼的編譯和調(diào)試_第4頁(yè)
Linux基礎(chǔ)-源代碼的編譯和調(diào)試_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

講師:楊行系列課程—Linux基礎(chǔ)源代碼的編譯和調(diào)試第六章課程目標(biāo)具備搭建linux系統(tǒng)平臺(tái)能力系統(tǒng)安裝具備Linux系統(tǒng)日常維護(hù)能力文件,目錄結(jié)構(gòu)linux的常用命令,ViShell腳本編程、管道及其重定向tftp,nfs服務(wù)器的配置熟悉Linux系統(tǒng)下的開發(fā)環(huán)境Gcc,Gdb課程安排第一天

上午:Linux系統(tǒng)簡(jiǎn)介和安裝下午:Linux安裝實(shí)際演練第二天

上午:Linux基本操作命令下午:Linux基本操作命令實(shí)戰(zhàn)第三天上午:Linux進(jìn)程操作

下午:Linux服務(wù)器配置第四天

上午:Linux腳本編程上下午:Linux腳本編程下第五天

上午:源代碼編譯和調(diào)試下午:多模塊軟件的編譯和鏈接(預(yù)科內(nèi)容,根據(jù)實(shí)際情況調(diào)整授課天數(shù),4-10天)課前提問Linux之下常見的編輯工具有哪些?C語言如何編譯、鏈接?默認(rèn)生成的C語言可執(zhí)行文件名是什么?如何調(diào)試源程序?本章目標(biāo)Linux下的常用編輯工具GCC編譯環(huán)境GDB調(diào)試環(huán)境6文本編輯器的作用Linux系統(tǒng)中的配置文件以文本文件的形式保存Linux管理員需要通過編輯配置文件進(jìn)行系統(tǒng)管理文本編輯器的分類行編輯器與全屏幕編輯器字符界面編輯器與圖形界面編輯器知識(shí)點(diǎn)1-常見的文本編輯器7viLinux學(xué)習(xí)者需要掌握的第一個(gè)文本編輯器大多數(shù)Linux系統(tǒng)中缺省使用的文本編輯器

Emacs用于編輯程序源代碼文件的文本編輯器nano在字符界面提供了菜單操作,易用性較好geditGNOME圖形環(huán)境中的文本編輯器常見的文本編輯器8vi編輯器中有三種狀態(tài)模式命令模式輸入模式末行模式Shell提示符退出vivifile末行模式輸入模式轉(zhuǎn)義命令按[Esc]鍵文本輸入命令執(zhí)行完畢或按[Esc]鍵命令模式vi中三種模式的轉(zhuǎn)換常見的文本編輯器-VI9vi編輯器的啟動(dòng)與退出文件操作光標(biāo)移動(dòng)操作編輯操作查找與替換操作vi編輯器的在線幫助常見的文本編輯器-VI10直接進(jìn)入編輯環(huán)境$vi進(jìn)入編輯環(huán)境并打開(新建)文件$vimyfile退出vi編輯環(huán)境輸入末行命令放棄對(duì)文件的修改,并退出編輯器:q!

vi的啟動(dòng)與退出常見的文本編輯器-VI11讀取文件保存文件另存為文件退出vi編輯器常見的文本編輯器-VI12保存文件保存對(duì)vi編輯器中已打開文件的修改:w另存為文件將vi編輯器中的內(nèi)容另存為指定文件名:wmyfile常見的文本編輯器-VI13未修改退出沒有對(duì)vi編輯器中打開的文件進(jìn)行修改,或已對(duì)修改進(jìn)行了保存,直接退出vi編輯器:q保存并退出對(duì)vi編輯器中的文件進(jìn)行保存并退出vi編輯器:wq不保存退出放棄對(duì)文件內(nèi)容的修改,并退出vi編輯器:q!常見的文本編輯器-VI14編譯工具:把一個(gè)源程序編譯為一個(gè)可執(zhí)行程序調(diào)試工具:能對(duì)執(zhí)行程序進(jìn)行源碼或匯編級(jí)調(diào)試軟件工程工具:用于協(xié)助多人開發(fā)或大型軟件項(xiàng)目的管理,如make、CVS、Subvision其他工具:用于把多個(gè)目標(biāo)文件鏈接成可執(zhí)行文件的鏈接器,或者用作格式轉(zhuǎn)換的工具。知識(shí)點(diǎn)1-編譯工具GCChttp:///http:///http:///http:///http:///http:///index.php15編譯工具GCC-參考資源16全稱為GNUCC,GNU項(xiàng)目中符合ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng)編譯如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多種語言GCC是可以在多種硬體平臺(tái)上編譯出可執(zhí)行程序的超級(jí)編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%~30%一個(gè)交叉平臺(tái)編譯器,適合在嵌入式領(lǐng)域的開發(fā)編譯編譯工具GCC17GNUCompilerCollectionC,C++,Objective-C,Fortran,Java,Adahttp://GCC4.3.0GCC2.95July31,1999GCC3.0June18,2001GCC3.2August14,2002GCC3.3May13,2003Mar5,2008December3,1997編譯工具GCC18GCC編譯過程GCC的編譯流程分為四個(gè)步驟:預(yù)處理(Pre-Processing)編譯(Compiling)匯編(Assembling)鏈接(Linking)編輯器預(yù)處理器編譯器鏈接匯編處理源代碼*.c預(yù)處理文件*.i匯編文件*.s匯編文件*.o可執(zhí)行程序*.exe19gcc所支持后綴名解釋.c C原始程序.C/.cc/.cxx C++原始程序.m Objective-C原始程序.i 已經(jīng)過預(yù)處理的C原始程序.ii 已經(jīng)過預(yù)處理的C++原始程序.s/.S 匯編語言原始程序.h 預(yù)處理文件(頭文件).o 目標(biāo)文件.a/.so 編譯后的庫(kù)文件編譯工具GCC分析器:分析器將源語言程序代碼轉(zhuǎn)換為匯編語言。因?yàn)橐獜囊环N格式轉(zhuǎn)換為另一種格式(C到匯編),所以分析器需要知道目標(biāo)機(jī)器的匯編語言。匯編器:匯編器將匯編語言代碼轉(zhuǎn)換為CPU可以執(zhí)行字節(jié)碼。鏈接器:鏈接器將匯編器生成的單獨(dú)的目標(biāo)文件組合成可執(zhí)行的應(yīng)用程序。鏈接器需要知道這種目標(biāo)格式以便工作。標(biāo)準(zhǔn)C庫(kù):核心的C函數(shù)都有一個(gè)主要的C庫(kù)來提供。如果在應(yīng)用程序中用到了C庫(kù)中的函數(shù),這個(gè)庫(kù)就會(huì)通過鏈接器和源代碼連接來生成最終的可執(zhí)行程序。編譯工具GCC21調(diào)用cpp進(jìn)行預(yù)處理,對(duì)源代碼文件中的文件包含(include)、預(yù)編譯語句(如宏定義define等)進(jìn)行分析;調(diào)用cc1進(jìn)行編譯,生成.o為后綴的目標(biāo)文件;調(diào)用as進(jìn)行匯編,匯編語言文件經(jīng)過預(yù)編譯和匯編之后都生成以.o為后綴的目標(biāo)文件;調(diào)用ld進(jìn)行鏈接,所有的目標(biāo)文件被安排在可執(zhí)行程序中的恰當(dāng)?shù)奈恢?。同時(shí),該程序所調(diào)用到的庫(kù)函數(shù)也從各自所在的檔案庫(kù)中鏈接到合適的地方。編譯工具GCC22Gcc最基本的用法是∶gcc[options][filenames]-c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。-ooutput_filename,確定輸出文件的名稱為output_filename,同時(shí)這個(gè)名稱不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。-g,產(chǎn)生符號(hào)調(diào)試工具(GNU的gdb)所必要的符號(hào)資訊,要想對(duì)源代碼進(jìn)行調(diào)試,我們就必須加入這個(gè)選項(xiàng)。-O,對(duì)程序進(jìn)行優(yōu)化編譯、連接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、連接過程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。-O2,比-O更好的優(yōu)化編譯、連接,當(dāng)然整個(gè)編譯、連接過程會(huì)更慢。-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過程中使用的參數(shù)。-Ldirname,將dirname所指出的目錄加入到程序函數(shù)檔案庫(kù)文件的目錄列表中,是在鏈接過程中使用的參數(shù)。編譯工具GCC第一類∶C語法錯(cuò)誤錯(cuò)誤信息∶文件source.c中第n行有語法錯(cuò)誤(syntex

errror)。有些情況下,一個(gè)很簡(jiǎn)單的語法錯(cuò)誤,gcc會(huì)給出一大堆錯(cuò)誤,我們最主要的是要保持清醒的頭腦,不要被其嚇倒,必要的時(shí)候再參考一下C語言的基本教材。第二類∶頭文件錯(cuò)誤錯(cuò)誤信息∶找不到頭文件head.h(Cannotfindincludefilehead.h)。這類錯(cuò)誤是源代碼文件中的包含頭文件有問題,可能的原因有頭文件名錯(cuò)誤、指定的頭文件所在目錄名錯(cuò)誤等,也可能是錯(cuò)誤地使用了雙引號(hào)和尖括號(hào)。

23編譯工具GCC-錯(cuò)誤類型及應(yīng)對(duì)方法第三類∶檔案庫(kù)錯(cuò)誤錯(cuò)誤信息∶鏈接程序找不到所需的函數(shù)庫(kù)(ld:-lm:Nosuchfileordirectory)。這類錯(cuò)誤是與目標(biāo)文件相連接的函數(shù)庫(kù)有錯(cuò)誤,可能的原因是函數(shù)庫(kù)名錯(cuò)誤、指定的函數(shù)庫(kù)所在目錄名稱錯(cuò)誤等,檢查的方法是使用find命令在可能的目錄中尋找相應(yīng)的函數(shù)庫(kù)名,確定檔案庫(kù)及目錄的名稱并修改程序中及編譯選項(xiàng)中的名稱。

24編譯工具GCC-錯(cuò)誤類型及應(yīng)對(duì)方法第四類∶未定義符號(hào)錯(cuò)誤信息∶有未定義的符號(hào)(Undefinedsymbol)。這類錯(cuò)誤是在連接過程中出現(xiàn)的,可能有兩種原因∶一是使用者自己定義的函數(shù)或者全局變量所在源代碼文件,沒有被編譯、連接,或者干脆還沒有定義,這需要使用者根據(jù)實(shí)際情況修改源程序,給出全局變量或者函數(shù)的定義體;二是未定義的符號(hào)是一個(gè)標(biāo)準(zhǔn)的庫(kù)函數(shù),在源程序中使用了該庫(kù)函數(shù),而連接過程中還沒有給定相應(yīng)的函數(shù)庫(kù)的名稱,或者是該檔案庫(kù)的目錄名稱有問題,這時(shí)需要使用檔案庫(kù)維護(hù)命令ar檢查我們需要的庫(kù)函數(shù)到底位于哪一個(gè)函數(shù)庫(kù)中,確定之后,修改gcc連接選項(xiàng)中的-l和-L項(xiàng)。25編譯工具GCC-錯(cuò)誤類型及應(yīng)對(duì)方法#include<stdio.h>int

main(void){int

i,j;j=0;i=j+1;printf(“hello,world\n”);printf(“theresultis%d\n”,i);}編譯:$gcc–otesttest.c執(zhí)行:$./test查看更詳細(xì)的信息:

$gcc–v–otesttest.c

26編譯工具GCC-使用實(shí)例27Pre-processor

(cpp/

Gcc-E)Compiler(cc1/

Gcc-S)Assembler(as/

Gcc-c)Linker(ld)

hello.c

(text)hello.i

(text)hello.s

(text)hello.o

(binary)hello

(binary)printf.o

(binary)編譯工具GCC-使用實(shí)例$gcc–Etest.c-otest.i

用wc命令,查看這兩個(gè)階段代碼大小:$wc

test.c

test.cpp916127test.c842193416498test.cpp851195016625總用量test.cpp比test.c增加了很多內(nèi)容,主要是放在系統(tǒng)提供的include文件中的。28編譯工具GCC-生成預(yù)處理代碼檢查語法錯(cuò)誤,并生成匯編文件$gcc–Stest.c–otest.s

29編譯工具GCC-生成匯編代碼方法一,用gcc直接從C源代碼中生成目標(biāo)代碼:$gcc–ctest.s–otest.o方法二,用匯編器從匯編代碼生成目標(biāo)代碼:$astest.s–otest.o

30編譯工具GCC-生成目標(biāo)代碼將目標(biāo)程序鏈接庫(kù)資源,生成可執(zhí)行程序$gcc–ctest.s–otest./test編譯工具GCC-生成可執(zhí)行程序設(shè)計(jì)并實(shí)現(xiàn)一個(gè)程序MyPWD,能夠查詢當(dāng)前用戶的絕對(duì)路徑。功能類似與shell的pwd命令。#include<limits.h>#include<iostream>#include<unistd.h>Usingnamespacestd;Int

main(void){Charcur_work_dir[PATH_MAX];Cout<<“CurrentMaxPathLengthis”<<PATH_MAX<<endl;If(getcwd(cur_work_dir,PATH_MAX)==NULL){Perror(“Couldn’tgetcurrentworkingdirectory!”);Return1;}Cout<<“Currentworkingdirectoryis”<<cur_work_dir<<endl;Return0;}編譯工具GCC-練習(xí)題33首先使用gcc對(duì)test.c進(jìn)行編譯,注意一定要加上選項(xiàng)‘-g’#

gcc-gtest.c-otest

#

gdbtest

GNUgdbRedHatLinux(-1.21rh)Copyright2004FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Type"showcopying"toseetheconditions.Thereisabsolutelyn

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論