Linux基礎-源代碼的編譯和調試_第1頁
Linux基礎-源代碼的編譯和調試_第2頁
Linux基礎-源代碼的編譯和調試_第3頁
Linux基礎-源代碼的編譯和調試_第4頁
Linux基礎-源代碼的編譯和調試_第5頁
已閱讀5頁,還剩32頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、上嵌網院 講師:楊行系列課程Linux基礎源代碼的編譯和調試第六章上嵌網院 課程目標具備搭建具備搭建linuxlinux系統平臺能力系統平臺能力系統安裝具備具備LinuxLinux系統日常維護能力系統日常維護能力文件,目錄結構linux的常用命令,ViShell腳本編程、管道及其重定向tftp,nfs服務器的配置熟悉熟悉LinuxLinux系統下的開發環境系統下的開發環境Gcc,Gdb上嵌網院 課程安排 第一天第一天 上午:上午:LinuxLinux系統簡介和安裝系統簡介和安裝 下午:下午:LinuxLinux安裝實際演練安裝實際演練 第二天第二天 上午:上午:LinuxLinux基本操作命令

2、基本操作命令 下午:下午:LinuxLinux基本操作命令實戰基本操作命令實戰 第三天第三天 上午:上午: Linux Linux進程操作進程操作 下午:下午:LinuxLinux服務器配置服務器配置 第四天第四天 上午:上午:LinuxLinux腳本編程腳本編程 上上 下午:下午:LinuxLinux腳本編程下腳本編程下 第五天第五天 上午:源代碼編譯和調試上午:源代碼編譯和調試 下午:下午:多模塊軟件的編譯和鏈接多模塊軟件的編譯和鏈接(預科內容,根據實際情況調整授課天數,(預科內容,根據實際情況調整授課天數,4-104-10天)天) 上 嵌課前提問LinuxLinux之下常見的編輯工具有哪

3、些?之下常見的編輯工具有哪些?C C語言如何編譯、鏈接?語言如何編譯、鏈接?默認生成的默認生成的C C語言可執行文件名是什么?語言可執行文件名是什么?如何調試源程序?如何調試源程序?上 嵌本章目標LinuxLinux下的常用編輯工具下的常用編輯工具GCCGCC編譯環境編譯環境GDBGDB調試環境調試環境上 嵌6 文本編輯器的作用 Linux系統中的配置文件以文本文件的形式保存 Linux管理員需要通過編輯配置文件進行系統管理 文本編輯器的分類 行編輯器與全屏幕編輯器 字符界面編輯器與圖形界面編輯器 知識點1-常見的文本編輯器上 嵌7 vi Linux學習者需要掌握的第一個文本編輯器 大多數Li

4、nux系統中缺省使用的文本編輯器 Emacs 用于編輯程序源代碼文件的文本編輯器 nano 在字符界面提供了菜單操作,易用性較好 gedit GNOME圖形環境中的文本編輯器常見的文本編輯器上 嵌8 vi編輯器中有三種狀態模式 命令模式 輸入模式 末行模式Shell提示符提示符退出退出vivi file末行模式末行模式輸入模式輸入模式轉義命令轉義命令按按Esc鍵鍵文本輸入命令文本輸入命令執行完畢或按執行完畢或按Esc鍵鍵命令模式命令模式vi中三種模式的轉換中三種模式的轉換常見的文本編輯器-VI上 嵌9 vi編輯器的啟動與退出 文件操作 光標移動操作 編輯操作 查找與替換操作 vi編輯器的在線幫

5、助 常見的文本編輯器-VI上 嵌10 直接進入編輯環境 $ vi 進入編輯環境并打開(新建)文件$ vi myfile 退出vi編輯環境 輸入末行命令放棄對文件的修改,并退出編輯器:q! vi的啟動與退出的啟動與退出常見的文本編輯器-VI上 嵌11 讀取文件 保存文件 另存為文件 退出vi編輯器 常見的文本編輯器-VI上 嵌12 保存文件 保存對vi編輯器中已打開文件的修改:w 另存為文件 將vi編輯器中的內容另存為指定文件名:w myfile常見的文本編輯器-VI上 嵌13 未修改退出 沒有對vi編輯器中打開的文件進行修改,或已對修改進行了保存,直接退出vi編輯器:q 保存并退出 對vi編輯

6、器中的文件進行保存并退出vi編輯器:wq 不保存退出 放棄對文件內容的修改,并退出vi編輯器:q!常見的文本編輯器-VI上 嵌14 編譯工具:把一個源程序編譯為一個可執行程序 調試工具:能對執行程序進行源碼或匯編級調試 軟件工程工具:用于協助多人開發或大型軟件項目的管理,如make、CVS、Subvision 其他工具:用于把多個目標文件鏈接成可執行文件的鏈接器,或者用作格式轉換的工具。知識點1-編譯工具GCC上 嵌 / / / / http:/ h

7、ttp:/ 嵌16 全稱為GNU CC ,GNU項目中符合ANSI C標準的編譯系統 編譯如C、C+、Object C、Java、Fortran、Pascal、Modula-3和Ada等多種語言 GCC是可以在多種硬體平臺上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%30% 一個交叉平臺編譯器 ,適合在嵌入式領域的開發編譯 編譯工具GCC上 嵌17 GNU Compiler Collection C, C+, Objective-C, Fortran, Java, Ada GCC 4.3.0 GCC 2.95 July 31,

8、1999 GCC 3.0 June 18, 2001 GCC 3.2 August 14, 2002 GCC 3.3May 13, 2003 Mar 5, 2008 December 3, 1997 編譯工具GCC上 嵌18GCC編譯過程 GCC的編譯流程分為四個步驟: 預處理(Pre-Processing) 編譯(Compiling) 匯編(Assembling)1. 鏈接(Linking)編輯器預處理器編譯器鏈接匯編處理源代碼 *.c預處理文件 *.i匯編文件 *.s匯編文件 *.o可執行程序 *.exe上 嵌19 gcc所支持后綴名解釋 .cC原始程序 .C/.cc/.cxxC+原始程序

9、 .mObjective-C原始程序 .i已經過預處理的C原始程序 .ii已經過預處理的C+原始程序 .s/.S匯編語言原始程序 .h預處理文件(頭文件) .o目標文件 .a/.so 編譯后的庫文件編譯工具GCC上 嵌 分析器:分析器將源語言程序代碼轉換為匯編語言。因為要從一種格式轉換為另一種格式(C到匯編),所以分析器需要知道目標機器的匯編語言。 匯編器:匯編器將匯編語言代碼轉換為CPU可以執行字節碼。 鏈接器:鏈接器將匯編器生成的單獨的目標文件組合成可執行的應用程序。鏈接器需要知道這種目標格式以便工作。 標準C庫:核心的C函數都有一個主要的C庫來提供。如果在應用程序中用到了C庫中的函數,這

10、個庫就會通過鏈接器和源代碼連接來生成最終的可執行程序。編譯工具GCC上 嵌21 調用cppcpp進行預處理,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析; 調用cc1cc1進行編譯,生成.o為后綴的目標文件; 調用asas進行匯編,匯編語言文件經過預編譯和匯編之后都生成以.o為后綴的目標文件; 調用ld ld進行鏈接,所有的目標文件被安排在可執行程序中的恰當的位置。同時,該程序所調用到的庫函數也從各自所在的檔案庫中鏈接到合適的地方。編譯工具GCC上 嵌22GccGcc最基本的用法是最基本的用法是 gcc options filenames gcc o

11、ptions filenames -c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。 -o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。 -O,對程序進行優化優化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯

12、、連接的速度就相應地要慢一些。-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。-Ldirname,將dirname所指出的目錄加入到程序函數檔案庫文件的目錄列表中,是在鏈接過程中使用的參數。編譯工具GCC上 嵌 第一類 C語法錯誤 錯誤信息 文件文件source.csource.c中第中第n n行有語法錯誤行有語法錯誤(syntex errror)(syntex errror)。有些情況下,一個很簡單的語法錯誤,gcc會給出一大堆錯誤,我們最主要的是要保持清醒的頭腦,不要被

13、其嚇倒,必要的時候再參考一下C語言的基本教材。 第二類 頭文件錯誤 錯誤信息 找不到頭文件找不到頭文件head.h(Can not find include file head.h)head.h(Can not find include file head.h)。這類錯誤是源代碼文件中的包含頭文件有問題,可能的原因有頭文件名錯誤、指定的頭文件所在目錄名錯誤等,也可能是錯誤地使用了雙引號和尖括號。 23編譯工具GCC-錯誤類型及應對方法上 嵌 第三類檔案庫錯誤 錯誤信息鏈接程序找不到所需的函數庫(鏈接程序找不到所需的函數庫(ld: -lm: No such file or directory )

14、。這類錯誤是與目標文件相連接的函數庫有錯誤,可能的原因是函數庫名錯誤、指定的函數庫所在目錄名稱錯誤等,檢查的方法是使用find命令在可能的目錄中尋找相應的函數庫名,確定檔案庫及目錄的名稱并修改程序中及編譯選項中的名稱。 24編譯工具GCC-錯誤類型及應對方法上 嵌 第四類未定義符號 錯誤信息有未定義的符號有未定義的符號(Undefined symbol)(Undefined symbol)。這類錯誤是在連接過程中出現的,可能有兩種原因一是使用者自己定義的函數或者全局變量所在源代碼文件,沒有被編譯、連接,或者干脆還沒有定義,這需要使用者根據實際情況修改源程序,給出全局變量或者函數的定義體;二是未

15、定義的符號是一個標準的庫函數,在源程序中使用了該庫函數,而連接過程中還沒有給定相應的函數庫的名稱,或者是該檔案庫的目錄名稱有問題,這時需要使用檔案庫維護命令ar檢查我們需要的庫函數到底位于哪一個函數庫中,確定之后,修改gcc連接選項中的-l和-L項。 25編譯工具GCC-錯誤類型及應對方法上 嵌#includeint main(void) int i,j; j=0; i=j+1; printf(“hello,worldn”); printf(“the result is %dn”,i);編譯: $ gcc o test test.c$ gcc o test test.c執行: $ ./test

16、$ ./test查看更詳細的信息: $ gcc v o test test.c $ gcc v o test test.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 E test.c -o test.i$ gcc E test.c

17、-o test.i 用wc命令,查看這兩個階段代碼大小: $ wc test.c test.cpp 9 16 127 test.c 842 1934 16498 test.cpp 851 1950 16625 總用量 test.cpp比test.c增加了很多內容,主要是放在系統提供的include文件中的。28編譯工具GCC-生成預處理代碼上 嵌 檢查語法錯誤檢查語法錯誤, ,并生成匯編文件并生成匯編文件 $ gcc S test.c o test.s $ gcc S test.c o test.s 29編譯工具GCC-生成匯編代碼上 嵌 方法一,用gcc直接從C源代碼中生成目標代碼:$ gc

18、c c test.s o test.o$ gcc c test.s o test.o 方法二,用匯編器從匯編代碼生成目標代碼:$ as test.s o test.o $ as test.s o test.o 30編譯工具GCC-生成目標代碼上 嵌將目標程序鏈接庫資源,生成可執行程序將目標程序鏈接庫資源,生成可執行程序$ gcc c test.s o test$ gcc c test.s o test./test./test編譯工具GCC-生成可執行程序上 嵌設計并實現一個程序MyPWD,能夠查詢當前用戶的絕對路徑。功能類似與shell的pwd命令。#include #include #inc

19、lude Using namespace std;Int main(void)Char cur_work_dirPATH_MAX;Cout“Current Max Path Length is ”PATH_MAXendl;If( getcwd( cur_work_dir, PATH_MAX ) =NULL ) Perror( “ Couldnt get current working directory!” ); Return 1;Cout“Current working directory is ” cur_work_direndl;Return 0;編譯工具GCC-練習題上 嵌33 首先使

20、用gcc對test.c進行編譯,注意一定要加上選項-g # # gcc -g test.c -o testgcc -g test.c -o test # gdb test gdb test GNU gdb Red Hat Linux (-1.21rh)Copyright 2004 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the condition

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論