版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Linux Gcc簡介第1頁,共17頁。目錄主要議題:什么是Gccgcc所遵循的部分約定規(guī)則 Gcc的執(zhí)行過程 Gcc的基本用法和選項 小實例Gcc的錯誤類型及對策 C語法錯誤 頭文件錯誤 檔案庫錯誤 未定義符號 第2頁,共17頁。什么是Gcc什么是GccLinux系統(tǒng)下的Gcc(GNU C Compiler)是GNU推出的功能強大、性能優(yōu)越的多平臺編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%30%。 Gcc編譯器能將C、C+語言源程序、匯程式化序和目標程序編譯、連接成可執(zhí)行文件,如果沒有給出可執(zhí)行文件
2、的名字,gcc將生成一個名為a.out的文件。在Linux系統(tǒng)中,可執(zhí)行文件沒有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來區(qū)分可執(zhí)行文件和不可執(zhí)行文件。 第3頁,共17頁。gcc所遵循的部分約定規(guī)則gcc所遵循的部分約定規(guī)則前面提到便宜的后綴問題,而gcc則通過后綴來區(qū)別輸入文件的類別,下面我們來介紹gcc所遵循的部分約定規(guī)則。 .c為后綴的文件,C語言源代碼文件; .a為后綴的文件,是由目標文件構(gòu)成的檔案庫文件; .C,.cc或.cxx 為后綴的文件,是C+源代碼文件; .h為后綴的文件,是程序所包含的頭文件; .i 為后綴的文件,是已經(jīng)預(yù)處理過的C源代碼文件; .ii為后綴的文件,是已經(jīng)預(yù)處理過的C+
3、源代碼文件; .m為后綴的文件,是Objective-C源代碼文件; .o為后綴的文件,是編譯后的目標文件; .s為后綴的文件,是匯編語言源代碼文件; .S為后綴的文件,是經(jīng)過預(yù)編譯的匯編語言源代碼文件。 第4頁,共17頁。Gcc的執(zhí)行過程Gcc的執(zhí)行過程雖然我們稱Gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執(zhí)行文件的過程不僅僅是編譯的過程,而是要經(jīng)歷四個相互關(guān)聯(lián)的步驟預(yù)處理(也稱預(yù)編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。 命令gcc首先調(diào)用cpp進行預(yù)處理,在預(yù)處理過程中,對源代碼文件中的文件包含(
4、include)、預(yù)編譯語句(如宏定義define等)進行分析。接著調(diào)用cc1進行編譯,這個階段根據(jù)輸入文件生成以.o為后綴的目標文件。匯編過程是針對匯編語言的步驟,調(diào)用as進行工作,一般來講,.S為后綴的匯編語言源代碼文件和匯編、.s為后綴的匯編語言文件經(jīng)過預(yù)編譯和匯編之后都生成以.o為后綴的目標文件。當所有的目標文件都生成之后,gcc就調(diào)用ld來完成最后的關(guān)鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執(zhí)行程序中的恰當?shù)奈恢茫瑫r,該程序所調(diào)用到的庫函數(shù)也從各自所在的檔案庫中連到合適的地方。 第5頁,共17頁。Gcc的基本用法和選項Gcc的基本用法和選項在使用Gcc編譯器
5、的時候,我們必須給出一系列必要的調(diào)用參數(shù)和文件名稱。Gcc編譯器的調(diào)用參數(shù)大約有100多個,其中多數(shù)參數(shù)我們可能根本就用不到,這里只介紹其中最基本、最常用的參數(shù) Gcc最基本的用法是gcc options filenames ,其中options就是編譯器所需要的參數(shù),filenames給出相關(guān)的文件名稱。 第6頁,共17頁。Gcc的基本用法和選項Gcc的參數(shù)選項-c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。 -o output_filename,確定輸出文件的名稱為output_filename,同時這個
6、名稱不能和源文件同名。如果不給出這個選項,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)化編譯、連接,當然整個編譯、連接過程會更慢。 -Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過程中使用的參數(shù)。第7頁,共17頁。Gcc的基本用法和選項C程序中的頭文件包含兩種情
7、況 A)#include B)#include “myinc.h” 其中,A類使用尖括號(),B類使用雙引號(“ ”)。對于A類,預(yù)處理程序cpp在系統(tǒng)預(yù)設(shè)包含文件目錄(如/usr/include)中搜尋相應(yīng)的文件,而對于B類,cpp在當前目錄中搜尋頭文件,這個選項的作用是告訴cpp,如果在當前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設(shè)計中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個使用-I選項給出搜索路徑。 -Ldirname,將dirname所指出的目錄加入到程序函數(shù)檔案庫文件的目錄列表中,是在連接過程中使用的參數(shù)。在預(yù)設(shè)狀態(tài)下,連接程序ld
8、在系統(tǒng)的預(yù)設(shè)路徑中(如/usr/lib)尋找所需要的檔案庫文件,這個選項告訴連接程序,首先到-L指定的目錄中去尋找,然后到系統(tǒng)預(yù)設(shè)路徑中尋找,如果函數(shù)庫存放在多個目錄下,就需要依次使用這個選項,給出相應(yīng)的存放目錄。 -lname,在連接時,裝載名字為“l(fā)ibname.a”的函數(shù)庫,該函數(shù)庫位于系統(tǒng)預(yù)設(shè)的目錄或者由-L選項確定的目錄下。例如,-lm表示連接名為“l(fā)ibm.a”的數(shù)學(xué)函數(shù)庫。 第8頁,共17頁。小實例小實例在學(xué)習(xí)使用 GCC 之前,下面的這個例子能夠幫助各位迅速理解 GCC 的工作原理,并將其立即運用到實際的項目開發(fā)中去。首先用熟悉的編輯器輸入所示的代碼:hello.c# incl
9、ude int main() printf(Hello world, Linux programming!n); return 0;然后執(zhí)行下面的命令編譯和運行這段程序:# gcc hello.c -o hello# ./helloHello world, Linux programming!第9頁,共17頁。小實例小實例# gcc hello.o -o hello在采用模塊化的設(shè)計思想進行軟件開發(fā)時,通常整個程序是由多個源文件組成的,相應(yīng)地也就形成了多個編譯單元,使用 GCC 能夠很好地管理這些編譯單元。假設(shè)有一個由 foo1.c 和 foo2.c 兩個源文件組成的程序,為了對它們進行編譯,
10、并最終生成可執(zhí)行程序 foo ,可以使用下面這條命令:# gcc foo1.c foo2.c -o foo如果同時處理的文件不止一個, GCC 仍會按照預(yù)處理、編譯和鏈接的過程依次進行。如果深究起來,上面這條命令大致相當于依次執(zhí)行如下三條命令:# gcc -c foo1.c -o foo1.o# gcc -c foo2.c -o foo2.o# gcc foo1.o foo2.o -o foo在編譯一個包含許多源文件的工程時,若只用一條 GCC 命令來完成編譯是非常費時的。假設(shè)項目中有100個源文件需要編譯,并且每個源文件中都包含10000行代碼,如果像上面那樣僅用一條 GCC 命令來完成編譯
11、工作,那么 GCC 需要將每個源文件都重新編譯一遍,然后再全部連接起來。很顯然,這樣浪費的時間相當多,尤其是當用戶只是修改了其中某一個文件的時候,完全沒有必要將每個文件都重新編譯一遍,因為很多已經(jīng)生成的目標文件是不會改變的。要解決這個問題,關(guān)鍵是要靈活運用 GCC ,同時還要借助像 Make 這樣的工具。第10頁,共17頁。小實例小實例從程序員的角度看,只需簡單執(zhí)行一條 GCC 命令就可以了,但從編譯器的角度來看,卻需要完成一系列非常繁雜的工作。首先, GCC 調(diào)用預(yù)處理程序 cpp ,由它負責(zé)展開在源文件中定義的宏,并向其中插入 include 語句所包含的內(nèi)容;接著, GCC 會調(diào)用 cc
12、l 和 as 將處理后的源代碼編譯成目標代碼;最后, GCC 會調(diào)用鏈接程序 ld ,把生成的目標代碼鏈接成一個可執(zhí)行程序。為了更好地理解 GCC 的工作過程,可以把上述編譯過程分成幾個步驟單獨進行,并觀察每步的運行結(jié)果。第一步是進行預(yù)編譯,使用 -E 參數(shù)可以讓 GCC 在預(yù)處理結(jié)束后停止編譯過程:# gcc -E hello.c -o hello.i此時若查看 hello.i 文件中的內(nèi)容,會發(fā)現(xiàn) stdio.h 的內(nèi)容確實都插到文件里去了,而其它應(yīng)當被預(yù)處理的宏定義也都做了相應(yīng)的處理。下一步是將 hello.i 編譯為目標代碼,這可以通過使用 -c 參數(shù)來完成:# gcc -c hell
13、o.i -o hello.oGCC 默認將 .i 文件看成是預(yù)處理后的 C 語言源代碼,因此上述命令將自動跳過預(yù)處理步驟而開始執(zhí)行編譯過程,也可以使用 -x 參數(shù)讓 GCC 從指定的步驟開始編譯。最后一步是將生成的目標文件鏈接成可執(zhí)行文件:第11頁,共17頁。Gcc的錯誤類型及對策Gcc的錯誤類型及對策Gcc編譯器如果發(fā)現(xiàn)源程序中有錯誤,就無法繼續(xù)進行,也無法生成最終的可執(zhí)行文件。為了便于修改,gcc給出錯誤資訊,我們必須對這些錯誤資訊逐個進行分析、處理,并修改相應(yīng)的語言,才能保證源代碼的正確編譯連接。gcc給出的錯誤資訊一般可以分為四大類,下面我們分別討論其產(chǎn)生的原因和對策。 第12頁,共1
14、7頁。Gcc的錯誤類型及對策Gcc的錯誤類型及對策第一類C語法錯誤 錯誤資訊文件source.c中第n行有語法錯誤(syntex errror)。這種類型的錯誤,一般都是C語言的語法錯誤,應(yīng)該仔細檢查源代碼文件中第n行及該行之前的程序,有時也需要對該文件所包含的頭文件進行檢查。有些情況下,一個很簡單的語法錯誤,gcc會給出一大堆錯誤,我們最主要的是要保持清醒的頭腦,不要被其嚇倒,必要的時候再參考一下C語言的基本教材。 第13頁,共17頁。Gcc的錯誤類型及對策Gcc的錯誤類型及對策第二類頭文件錯誤 錯誤資訊找不到頭文件head.h(Can not find include file head.
15、h)。這類錯誤是源代碼文件中的包含頭文件有問題,可能的原因有頭文件名錯誤、指定的頭文件所在目錄名錯誤等,也可能是錯誤地使用了雙引號和尖括號。 第14頁,共17頁。Gcc的錯誤類型及對策Gcc的錯誤類型及對策第三類檔案庫錯誤 錯誤資訊連接程序找不到所需的函數(shù)庫,例如 ld: -lm: No such file or directory 這類錯誤是與目標文件相連接的函數(shù)庫有錯誤,可能的原因是函數(shù)庫名錯誤、指定的函數(shù)庫所在目錄名稱錯誤等,檢查的方法是使用find命令在可能的目錄中尋找相應(yīng)的函數(shù)庫名,確定檔案庫及目錄的名稱并修改程序中及編譯選項中的名稱。 第15頁,共17頁。Gcc的錯誤類型及對策Gcc的錯誤類型及對策第四類未定義符號 錯誤資訊有未定義的符號(Undefined symbol)。這類錯誤是在連接過程中出現(xiàn)的
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 溝通的課件教學(xué)課件
- 2024年廣告資源銷售合同文本
- 2024年度合作經(jīng)營咖啡館之合伙協(xié)議書
- 模擬法庭課件教學(xué)課件
- 課件帶語音教學(xué)課件
- 2024商場美食廣場保險服務(wù)合同
- 2024【工商局業(yè)務(wù)表格格式條款備案申請書】工商局合同格式條款整治工作方案
- 2024年度噸不銹鋼帶打印功能電子地磅秤生產(chǎn)批次檢驗合同
- 04道路交通事故賠償合同
- 2024房產(chǎn)借款抵押合同樣本
- 個人理財課程房產(chǎn)規(guī)劃課件
- 混凝土澆筑及振搗措施方案
- 《思想道德與法治》 課件 第四章 明確價值要求 踐行價值準則
- 施工現(xiàn)場消防安全驗收表(總平面布置)
- 小學(xué)數(shù)學(xué)教師家長會ppt
- 君子自強不息課件
- 2022人教版高二英語新教材選擇性必修全四冊課文原文及翻譯(英漢對照)
- WDZANYJY23低壓電力電纜技術(shù)規(guī)格書
- 抗高血壓藥物基因檢測課件
- 醫(yī)院管理醫(yī)院應(yīng)急調(diào)配機制
- (公開課)文言文斷句-完整版課件
評論
0/150
提交評論