




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Linux-GCC-G+編譯器與調試器第第3章章 Linux GCC/G+編譯器與調試器編譯器與調試器編譯器是將易于編寫、閱讀和維護的高級計算機語言編譯器是將易于編寫、閱讀和維護的高級計算機語言翻譯為計算機能解讀、運行的低階機器語言的程序。調試器翻譯為計算機能解讀、運行的低階機器語言的程序。調試器是用于查找源代碼中的錯誤,測試源代碼和可執(zhí)行文件的工是用于查找源代碼中的錯誤,測試源代碼和可執(zhí)行文件的工具。具。GNU項目提供了項目提供了GCC編譯器、編譯器、G+編譯器和編譯器和GDB調試調試器,這些程序是在器,這些程序是在Linux系統(tǒng)上使用系統(tǒng)上使用C和和C+語言進行開發(fā)的語言進行開發(fā)的重要工具
2、。本章將介紹這些工具的安裝和使用方法。重要工具。本章將介紹這些工具的安裝和使用方法。3.1 GCC/G+編譯器編譯器GCC是是GNU項目中的一個子項目,最初為用于編譯項目中的一個子項目,最初為用于編譯C語言的編譯器。隨著語言的編譯器。隨著GNU項目的發(fā)展,項目的發(fā)展,GCC已經(jīng)成為了能已經(jīng)成為了能編譯編譯C、C+、Ada、Object C和和Java等語言的等語言的GNU編譯器編譯器家族,同時還可執(zhí)行跨硬件平臺的交叉編譯工作。家族,同時還可執(zhí)行跨硬件平臺的交叉編譯工作。G+則是則是專門用來編寫專門用來編寫C和和C+語言的編譯器。語言的編譯器。C和和C+語言正在不斷語言正在不斷發(fā)展,為了保持兼容
3、程序語言的最新特性,開發(fā)者通常選擇發(fā)展,為了保持兼容程序語言的最新特性,開發(fā)者通常選擇GCC來編譯來編譯C語言編寫的源代碼,選擇語言編寫的源代碼,選擇G+來編譯來編譯C+源代源代碼。碼。3.1.1 GCC/G+編譯器安裝編譯器安裝安裝或更新安裝或更新GCC和和G+可在可在GNU項目的官方網(wǎng)站講義項目的官方網(wǎng)站講義去下載相應的安裝包,也可以使用去下載相應的安裝包,也可以使用YUM軟件包管理器安裝軟件包管理器安裝。安裝。安裝GCC和和G+的命令如下:的命令如下:yum install make/ 安裝安裝make程序程序yum install gcc/ 安裝安裝GCC編譯器編譯器yum insta
4、ll gcc-c+/ 安裝安裝G+編譯器編譯器注意:如果安裝過程中提示需要選擇編譯器版本,可注意:如果安裝過程中提示需要選擇編譯器版本,可根據(jù)當前硬件平臺選擇最新發(fā)布的版本。另外,如果提示需根據(jù)當前硬件平臺選擇最新發(fā)布的版本。另外,如果提示需要安裝其他相關軟件包,請一并安裝。要安裝其他相關軟件包,請一并安裝。3.1.2 GCC/G+編譯命令編譯命令GCC/G+編譯器沒有圖形界面,只能在終端上以命令編譯器沒有圖形界面,只能在終端上以命令方式運行。編譯命令由命令名、選項和源文件名組成,格式方式運行。編譯命令由命令名、選項和源文件名組成,格式如下所示:如下所示:gcc -選項選項 1 -選項選項 2
5、-選項選項 n g+ -選項選項 1 -選項選項 2-選項選項 n 命令名、選項和源文件名之間使用空格分隔,一行命命令名、選項和源文件名之間使用空格分隔,一行命令中可以有多個選項,也可以只有一個選項。文件名可以包令中可以有多個選項,也可以只有一個選項。文件名可以包含文件的絕對路徑,也可以使用相對路徑。如果文件名中不含文件的絕對路徑,也可以使用相對路徑。如果文件名中不包含路徑,那么源文件被視為存在于工作目錄中。如果命令包含路徑,那么源文件被視為存在于工作目錄中。如果命令中不包含輸出的可執(zhí)行文件名稱,默認情況下將在工作目錄中不包含輸出的可執(zhí)行文件名稱,默認情況下將在工作目錄中生成后綴為中生成后綴為
6、“.out”的可執(zhí)行文件。的可執(zhí)行文件。3.1.3 GCC/G+編譯選項編譯選項GCC擁有一百多個編譯選項。對于擁有一百多個編譯選項。對于C語言和語言和C+語言,語言,G+與與GCC的編譯選項基本相同。常用的的編譯選項基本相同。常用的GCC和和G+編譯編譯選項見表所示:選項見表所示: 3.1.4 GCC/G+編譯器執(zhí)行過程編譯器執(zhí)行過程GCC和和G+編譯器執(zhí)行過程可總結為四步:預處理、編譯器執(zhí)行過程可總結為四步:預處理、編譯、匯編、連接。在預處理過程中,編譯器會對源代碼中編譯、匯編、連接。在預處理過程中,編譯器會對源代碼中的頭文件和預處理語句進行分析,生成以的頭文件和預處理語句進行分析,生成以
7、“.i”為后綴的預處為后綴的預處理文件。理文件。3.2 程序和進程程序和進程程序和進程是操作系統(tǒng)中的重要概念,程序是可運行程序和進程是操作系統(tǒng)中的重要概念,程序是可運行的一組指令,程序以二進制代碼的形式保存在存儲設備中。的一組指令,程序以二進制代碼的形式保存在存儲設備中。操作系統(tǒng)運行程序后,該程序在內存中的映像就是進程,進操作系統(tǒng)運行程序后,該程序在內存中的映像就是進程,進程是活動的程序。程是活動的程序。3.2.1 程序程序程序是指一組指示計算機或其他具有信息處理能力設程序是指一組指示計算機或其他具有信息處理能力設備每一步動作的指令。備每一步動作的指令。Linux系統(tǒng)下的應用程序主要由兩種系統(tǒng)
8、下的應用程序主要由兩種特殊類型的文件代表,分別是可執(zhí)行文件和腳本程序??蓤?zhí)特殊類型的文件代表,分別是可執(zhí)行文件和腳本程序??蓤?zhí)行文件是能夠被計算機直接執(zhí)行的程序,相當于行文件是能夠被計算機直接執(zhí)行的程序,相當于Windows系系統(tǒng)中的統(tǒng)中的exe文件。使用文件。使用C和和C+語言設計的程序編譯后即是可語言設計的程序編譯后即是可執(zhí)行文件。執(zhí)行文件。Linux系統(tǒng)不要求可執(zhí)行文件使用特定的擴展名系統(tǒng)不要求可執(zhí)行文件使用特定的擴展名,文件是否能被執(zhí)行由文件的系統(tǒng)屬性來決定。,文件是否能被執(zhí)行由文件的系統(tǒng)屬性來決定。3.2.2 進程和進程和PID進程是一個具有獨立功能的程序關于某個數(shù)據(jù)集合的進程是一個
9、具有獨立功能的程序關于某個數(shù)據(jù)集合的一次可以并發(fā)執(zhí)行的運行活動,是處于活動狀態(tài)的程序。進一次可以并發(fā)執(zhí)行的運行活動,是處于活動狀態(tài)的程序。進程作為構成系統(tǒng)的基本元件,不僅是系統(tǒng)內部獨立運行的實程作為構成系統(tǒng)的基本元件,不僅是系統(tǒng)內部獨立運行的實體,而且是獨立競爭資源的實體。體,而且是獨立競爭資源的實體。在在Linux系統(tǒng)中,用戶創(chuàng)建進程時會先在系統(tǒng)的進程表系統(tǒng)中,用戶創(chuàng)建進程時會先在系統(tǒng)的進程表中為進程創(chuàng)建獨一無二的編碼,即中為進程創(chuàng)建獨一無二的編碼,即PID。PID是一個正整數(shù)是一個正整數(shù),取值范圍在,取值范圍在2到到32768之間。進程創(chuàng)建時會順序挑選下一個之間。進程創(chuàng)建時會順序挑選下一個
10、未使用的編號數(shù)字作為自己的未使用的編號數(shù)字作為自己的PID,如果他們已經(jīng)經(jīng)過一圈,如果他們已經(jīng)經(jīng)過一圈的循環(huán),新的編碼重新從的循環(huán),新的編碼重新從2開始。數(shù)字開始。數(shù)字1一般是為特殊進程一般是為特殊進程init保留的,它負責管理其他的進程。保留的,它負責管理其他的進程。 3.3 ANSI C標準標準C語言誕生后的很長一段時期內,并沒有針對語言誕生后的很長一段時期內,并沒有針對C語言制語言制定嚴格的標準。不同編譯器可能使用不同的語法規(guī)則或數(shù)據(jù)定嚴格的標準。不同編譯器可能使用不同的語法規(guī)則或數(shù)據(jù)結構,此狀況對程序的移植帶來很多麻煩。于是,美國國家結構,此狀況對程序的移植帶來很多麻煩。于是,美國國家
11、標準協(xié)會(標準協(xié)會(ANSI)決定統(tǒng)一)決定統(tǒng)一C語言的標準,并于語言的標準,并于202X年頒年頒布布ANSX3.159-202X標準文檔,這一標準被稱為標準文檔,這一標準被稱為ANSI C標準。標準。ANSI C標準在訂立時吸取了很多標準在訂立時吸取了很多C+語言的內容,語言的內容,同時促使同時促使C語言支持多國字符集,其中包括各種中文字符集語言支持多國字符集,其中包括各種中文字符集。ANSI C標準的推出使標準的推出使C語言保持著活力,成為最受開發(fā)者語言保持著活力,成為最受開發(fā)者歡迎的開發(fā)語言。歡迎的開發(fā)語言。3.3.1 函數(shù)原型函數(shù)原型函數(shù)原型由函數(shù)的返回類型、函數(shù)名和參數(shù)三部分組函數(shù)原
12、型由函數(shù)的返回類型、函數(shù)名和參數(shù)三部分組成。例如第一行中成。例如第一行中ssize_t表示該函數(shù)返回值是表示該函數(shù)返回值是ssize_t類型的類型的數(shù)值。括號中是參數(shù)列表,多個參數(shù)用逗號分隔,代碼中最數(shù)值。括號中是參數(shù)列表,多個參數(shù)用逗號分隔,代碼中最后一行后一行getpid三函數(shù)的參數(shù)是三函數(shù)的參數(shù)是void,表示,表示getpid函數(shù)沒有參數(shù)函數(shù)沒有參數(shù)。源代碼編譯時,因為編譯器已經(jīng)知道參數(shù)的類型,所以會。源代碼編譯時,因為編譯器已經(jīng)知道參數(shù)的類型,所以會將調用的參數(shù)進行強制轉換。將調用的參數(shù)進行強制轉換。3.3.2 類屬指針類屬指針類屬指針是一種能夠同時支持所有數(shù)據(jù)類型的指針,類屬指針是
13、一種能夠同時支持所有數(shù)據(jù)類型的指針,函數(shù)原型中常用的函數(shù)原型中常用的“void *”類型即是類屬指針。類型即是類屬指針。ANSI C標標準常用類屬指針代替函數(shù)參數(shù)中的其它指針,使同一個函數(shù)準常用類屬指針代替函數(shù)參數(shù)中的其它指針,使同一個函數(shù)能支持多種數(shù)據(jù)類型。相關內容將來本書的程序實例中多次能支持多種數(shù)據(jù)類型。相關內容將來本書的程序實例中多次見到。見到。3.3.3 原始系統(tǒng)數(shù)據(jù)類型原始系統(tǒng)數(shù)據(jù)類型在函數(shù)原型中以在函數(shù)原型中以“_t”結尾的類型被稱為原始系統(tǒng)數(shù)據(jù)結尾的類型被稱為原始系統(tǒng)數(shù)據(jù)類型。原始系統(tǒng)數(shù)據(jù)類型定義在頭文件類型。原始系統(tǒng)數(shù)據(jù)類型定義在頭文件“sys/types.h”中,以中,以t
14、ypedef操作符加以定義。原始系統(tǒng)數(shù)據(jù)類型是目標系統(tǒng)數(shù)操作符加以定義。原始系統(tǒng)數(shù)據(jù)類型是目標系統(tǒng)數(shù)據(jù)結構的接口,在不同的操作系統(tǒng)中,其字長會有變化。據(jù)結構的接口,在不同的操作系統(tǒng)中,其字長會有變化。3.4 編譯編譯hello worldhello world程序作為程序員學習的第一個程序已成為有程序作為程序員學習的第一個程序已成為有趣的慣例。本節(jié)將講述如何使用趣的慣例。本節(jié)將講述如何使用Linux系統(tǒng)中默認的編譯器系統(tǒng)中默認的編譯器編輯該程序的源代碼,并使用編輯該程序的源代碼,并使用GCC編譯器將該程序編譯為編譯器將該程序編譯為可執(zhí)行文件??蓤?zhí)行文件。3.4.1 使用使用VI編寫源代碼編寫源
15、代碼VI是是Linux系統(tǒng)中最常用的文本編輯器,幾乎所有系統(tǒng)中最常用的文本編輯器,幾乎所有Linux發(fā)行版中都已包含發(fā)行版中都已包含VI程序。它工作在控制臺或終端中程序。它工作在控制臺或終端中,通過,通過shell調用,全部操作均由命令完成,對于初學者來說調用,全部操作均由命令完成,對于初學者來說并不容易掌握。并不容易掌握。3.4.2 程序的編譯與連接程序的編譯與連接程序經(jīng)過編譯器的編譯與連接后,即可生成可執(zhí)行文程序經(jīng)過編譯器的編譯與連接后,即可生成可執(zhí)行文件。如果源代碼有語法錯誤,則會在終端上顯示錯誤信息。件。如果源代碼有語法錯誤,則會在終端上顯示錯誤信息。有些時候,編譯器會出現(xiàn)警告提示,但
16、程序依然被編譯成功有些時候,編譯器會出現(xiàn)警告提示,但程序依然被編譯成功。這表明源代碼沒有嚴格按照標準編寫,可能會在運行時出。這表明源代碼沒有嚴格按照標準編寫,可能會在運行時出現(xiàn)意外的結果。繼續(xù)前面的操作不改變工作目錄,編譯并連現(xiàn)意外的結果。繼續(xù)前面的操作不改變工作目錄,編譯并連接接“”“”程序,可在終端上輸入下列命令:程序,可在終端上輸入下列命令:gcc -o helloworld / 編譯并連接程序編譯并連接程序/“-o helloworld”表示使用表示使用“helloworld”作為目標文件作為目標文件名名3.4.3 使用終端運行程序使用終端運行程序Linux系統(tǒng)上運行程序,必須給出該程
17、序完整的路徑。系統(tǒng)上運行程序,必須給出該程序完整的路徑。前面的前面的“”“”文件建立在文件建立在“/home/用戶名用戶名/helloworld”目錄中目錄中,編譯和連接后所生成的可執(zhí)行文件也在該目錄中。運行程,編譯和連接后所生成的可執(zhí)行文件也在該目錄中。運行程序則需輸入序則需輸入“/home/用戶名用戶名/helloworld/helloworld”。但當前。但當前的工作目錄已經(jīng)是的工作目錄已經(jīng)是“/home/用戶名用戶名/helloworld”了,所以可了,所以可用用“./”替代工作目錄的路徑。替代工作目錄的路徑。3.5 GDB調試器調試器程序編寫后難免會出現(xiàn)各種錯誤,當程序完成編譯時程序
18、編寫后難免會出現(xiàn)各種錯誤,當程序完成編譯時,隱藏的錯誤可能會使程序無法正常運行,或者不能實現(xiàn)預,隱藏的錯誤可能會使程序無法正常運行,或者不能實現(xiàn)預期的功能。簡單的程序或淺顯的錯誤可依賴程序員的經(jīng)驗判期的功能。簡單的程序或淺顯的錯誤可依賴程序員的經(jīng)驗判斷出故障點,但現(xiàn)在的軟件規(guī)格越來越大,調試起來也就越斷出故障點,但現(xiàn)在的軟件規(guī)格越來越大,調試起來也就越來越困難。調試器是幫助程序員修改錯誤的得力工具,常用來越困難。調試器是幫助程序員修改錯誤的得力工具,常用的斷點、單步跟蹤等功能可快速找到故障點。的斷點、單步跟蹤等功能可快速找到故障點。3.5.1 GDB調試器概述調試器概述Linux程序員中最常用
19、的調試工具是程序員中最常用的調試工具是GDB,GDB調試器調試器是是GNU項目的子項目。該程序提供了所有常用調試功能,項目的子項目。該程序提供了所有常用調試功能,是是Linux系統(tǒng)中最為簡單快捷的調試工具。由于當前圖形用系統(tǒng)中最為簡單快捷的調試工具。由于當前圖形用戶界面(戶界面(GUI)普及,大量基于)普及,大量基于GUI的調試器被開發(fā)和運行的調試器被開發(fā)和運行在在Linux上。他們大多是以上。他們大多是以GDB為核心配上為核心配上GUI:用戶通過:用戶通過GUI發(fā)出命令,這些命令依次被傳送給發(fā)出命令,這些命令依次被傳送給GDB。其中一個是。其中一個是DDD,意為數(shù)據(jù)顯示調試器。在一些集成開發(fā)
20、環(huán)境如,意為數(shù)據(jù)顯示調試器。在一些集成開發(fā)環(huán)境如Eclipse中,也提供了調試功能,并且以中,也提供了調試功能,并且以GDB為核心。為核心。3.5.2 GDB調試器安裝調試器安裝通常在通常在Linux桌面版的軟件開發(fā)包集合中已包含桌面版的軟件開發(fā)包集合中已包含GDB調調試器,如果需要安裝或更新試器,如果需要安裝或更新GDB調試器,可使用調試器,可使用YUM軟件軟件包管理器完成,操作方法如下:包管理器完成,操作方法如下:yum install gdb/ YUM安裝安裝GDB調試器調試器3.5.3 GDB常用調試命令常用調試命令GDB調試器調試的對象是可執(zhí)行文件,使用調試器調試的對象是可執(zhí)行文件,使用GCC或或G+編譯器編譯編譯器編譯源代碼時,必須加上選項源代碼時,必須加上選項“-g”才能使目標可執(zhí)行文件包含可被調試的信息才能使目標可執(zhí)行文件包含可被調試的信息。3.5.4 在在GDB下運行程序下運行程序打開可執(zhí)行文件后,可根據(jù)需要在程序中加入斷點或打開可執(zhí)行文件后,可根據(jù)需要在程序中加入斷點或觀察點,并運行程序,以觀察點,并運行程序,以“helloworld”程序為例,可在為變程序為例,可在為變量賦值前加入斷點,并運行程序。繼續(xù)上一小節(jié)的操作,方量賦值前加入斷點,并運行程序。繼續(xù)上一小節(jié)的操作,方法如下:法如下:(gdb) break 5/ 在源代碼第在源代碼第5行,即變量行,即變量
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 年終大促品牌商家聯(lián)合促銷合同
- 和鄉(xiāng)愁有關的課件
- 兒童睡前護理方法
- 高考數(shù)學復習:重難點題型之軌跡八類求法(原卷版)
- 二次根式(11考點梳理+11題型解讀)原卷版-2024-2025學年人教版八年級數(shù)學下學期
- 讀后續(xù)寫萬能模版寫作句式講義-高三英語二輪復習
- 愛耳日 保護耳朵51
- 小兒驚厥后護理要點
- 小兒灌腸護理技術規(guī)范
- 呼吸評估及護理課件
- 中國2型糖尿病防治指南(2020年版)
- 輪式拖拉機的設計計算書
- 機械手培訓圖片與課件
- 天津中煤進出口有限公司筆試
- 2024北京通州區(qū)三年級(下)期末語文試題及答案
- 看守所業(yè)務知識培訓課件
- 2025年四川省建筑安全員-B證考試題庫及答案
- 傳輸質量評估體系-全面剖析
- 路燈如何施工方案
- 養(yǎng)老機構九防培訓課件
- 杭州市拱墅區(qū)部分校教科版六年級下冊期末考試科學試卷(解析版)
評論
0/150
提交評論