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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

$gcc–v–otesttest.c

26編譯工具GCC-使用實例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-使用實例$gcc–Etest.c-otest.i

用wc命令,查看這兩個階段代碼大?。?wc

test.c

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

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

30編譯工具GCC-生成目標代碼將目標程序鏈接庫資源,生成可執(zhí)行程序$gcc–ctest.s–otest./test編譯工具GCC-生成可執(zhí)行程序設(shè)計并實現(xiàn)一個程序MyPWD,能夠查詢當(dāng)前用戶的絕對路徑。功能類似與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對test.c進行編譯,注意一定要加上選項‘-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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論