4.Linux程序設(shè)計基礎(chǔ)—gcc_第1頁
4.Linux程序設(shè)計基礎(chǔ)—gcc_第2頁
4.Linux程序設(shè)計基礎(chǔ)—gcc_第3頁
4.Linux程序設(shè)計基礎(chǔ)—gcc_第4頁
4.Linux程序設(shè)計基礎(chǔ)—gcc_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Linux程序設(shè)計基礎(chǔ)程序設(shè)計基礎(chǔ)gcc使用使用gccgcc的簡介的簡介 n 編譯如C、C+、Object C、Java、Fortran、Pascal、Modula-3和Ada等多種語言n 一個交叉平臺編譯器, 適合在嵌入式領(lǐng)域的開發(fā)編譯n 全稱為GNU Compiler Collection, GNU項目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng)n gcc可以使程序員靈活地控制編譯過程。編譯過程一般可以分為下面四個階段,每個階段分別調(diào)用不同的工具進行處理預(yù)處理鏈接編譯匯編源 程 序(*.c)可執(zhí)行文件預(yù)處理器編譯器匯編器連接器gccgcc的四個階段的四個階段n 命令gcc首先調(diào)用cpp進行預(yù)處理,在預(yù)

2、處理過程中,對源代碼文件中的文件包含(include)、預(yù)編譯語句(如宏定義define等)進行分析。n 接著調(diào)用cc1進行編譯,這個階段根據(jù)輸入文件生成以.o為后綴的目標(biāo)文件。n 匯編過程是針對匯編語言的步驟,調(diào)用as進行工作,一般來講,.S或.s為后綴的匯編語言源代碼文件匯編之后都生成以.o為后綴的目標(biāo)文件。n 當(dāng)所有的目標(biāo)文件都生成之后,gcc就調(diào)用ld來完成最后的關(guān)鍵性工作,這個階段就是連接。在連接階段,所有的目標(biāo)文件被安排在可執(zhí)行程序中的恰當(dāng)?shù)奈恢茫瑫r,該程序所調(diào)用到的庫函數(shù)也從各自所在的函數(shù)庫中連到合適的地方。 gccgcc版本歷史版本歷史可執(zhí)行文件格式 n Linux系統(tǒng)中可執(zhí)

3、行文件有兩種格式。 第一種格式是a.out格式,這種格式用于早期的Linux系統(tǒng)以及 Unix系統(tǒng)的原始格式。a.out來自于Unix C編譯程序默認的可執(zhí)行文件名。當(dāng)使用共享庫時,a.out格式就會發(fā)生問題。把a.out格式調(diào)整為共享庫是一種非常復(fù)雜的操作。 因此,一種新的文件格式被引入Unix系統(tǒng)5的第四版本和Solaris系統(tǒng)中。它被稱為可執(zhí)行和連接的格式(ELF)。這種格式很容易實現(xiàn)共享庫。 ELF格式已經(jīng)被Linux系統(tǒng)作為標(biāo)準(zhǔn)的格式采用。 ELF(Executable and Linking Format )n gcc編譯程序產(chǎn)生的所有的二進制文件都是ELF格式的文件(即使可執(zhí)行文

4、件的默認名仍然是a.out)。較舊的a.out格式的程序仍然可以運行在支持ELF格式的系統(tǒng)上。 gccgcc的使用的使用n 基本語法 gcc options filenamesn 說明: 在gcc后面可以有多個編譯選項,同時進行多個編譯操作。很多的gcc選項包括一個以上的字符。因此你必須為每個選項指定各自的連字符。例如,下面的兩個命令是不同的: gcc -p -g test1.c gcc -pg 當(dāng)你不用任何選項編譯一個程序時,GCC將會建立(假定編譯成功)一個名為a.out的可執(zhí)行文件。 Gcc所支持的后綴名解釋n .c C源程序n .C/.cc/.cxx c+源程序n .m Objecti

5、ve-C原始程序n .i 經(jīng)過預(yù)處理的C原始程序n .ii 經(jīng)過預(yù)處理的C+原始程序n .s/.S 匯編語言原始程序n .h 預(yù)處理文件(頭文件)n .o 目標(biāo)文件n .a/.so 編譯后的庫文件gcc選項n -o選項 你能用 -o 編譯選項來為將產(chǎn)生的可執(zhí)行文件指定一個文件名來代替 a.out。 例:gcc o count -c選項:告訴GCC僅把源代碼編譯為目標(biāo)代碼而跳過匯編和連接的步驟。 例:gcc c -E 不生成文件,只輸出預(yù)處理結(jié)果(輸出終端)。 n -S 編譯選項告訴 gcc 在為 C 代碼產(chǎn)生了匯編語言文件后停止編譯。n -g 產(chǎn)生調(diào)試工具gdb所必要的符號信息,要想對編譯出的

6、程序調(diào)試,就必須加入這個選項。 n -Wall 提示更多警告信息警告選項警告選項n 在gcc中用開關(guān)-Wall控制警告信息,使用示例命令如下: gcc Wall -o test3_1 test3_ -w 不生成任何警告信息。 查找選項n gcc一般使用默認路徑查找頭文件和庫文件。如果文件所用的頭文件或庫文件不在缺省目錄下,則編譯時要指定它們的查找路徑。 -I選項:指定頭文件的搜索目錄例:gcc I/export/home/st o test1 test1.c -L選項:指定庫文件的搜索目錄例:gcc L/usr/X11/R6/lib o test1 test1.c與庫和路徑相關(guān)選項n -I d

7、ir 在dir這個目錄尋找被include的文件n -L dir 在dir這個目錄尋找被-I的庫n -l name 鏈接庫文件文件名為libname.a 或libname.so的庫-fpic或-fPIC 產(chǎn)生位置無關(guān)的目標(biāo)代碼,以構(gòu)造共享庫(share library)-static 禁止與共享庫鏈接,若沒有,則優(yōu)選選擇共享庫鏈接-shared 產(chǎn)生共享庫,在創(chuàng)建共享函數(shù)庫 時使用多個源文件生成一個可執(zhí)行文件多個源文件生成一個可執(zhí)行文件 問題:有多個源文件時,如何生成一個可執(zhí)行文件?n 方法1:gcc o mytest test1.c test2.c 方法2:gcc -c test1.cgcc

8、 c test2.c gcc c test3.c gcc o mytest test1.o test2.o test3.o優(yōu)化選項優(yōu)化選項 n 優(yōu)化選項可以使GCC在耗費更多編譯時間和犧牲易調(diào)試性的基礎(chǔ)上產(chǎn)生更小更快的可執(zhí)行文件。這些選項中最典型的是-O和-O2選項。 -O0 不進行優(yōu)化處理。 -O選項:告訴GCC對源代碼進行基本優(yōu)化。源代碼會在編譯,連接過程中進行優(yōu)化處理。 -O2選項:告訴GCC 產(chǎn)生盡可能小和盡可能快的代碼。-O2選項將使編譯的速度比使用-O時慢。但通常產(chǎn)生的代碼執(zhí)行速度會更快。 -O3選項:比 -O2 更進一步優(yōu)化,包括 inline 函數(shù)。 版本選項n -v選項 用戶

9、將會得到自己目前正在使用的gcc的版本及與版本相關(guān)的一些信息。 gcc -v 將得到如下結(jié)果: Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2n -V 選項 如果安裝了多個版本的gcc,并且想強制執(zhí)行其中的某個版本,可以用命令通知系統(tǒng)用戶要使用的版本。 gcc -V2.6.3 -v靜態(tài)庫與動態(tài)庫靜態(tài)庫與動態(tài)庫n 靜態(tài)庫:在編譯過程中將庫函數(shù)代碼直接加入到生成的可執(zhí)行程序中,程序運行過程中不需要利用庫函數(shù)n 共享庫:編譯時,只是在生成的可執(zhí)行程序中簡單指定需要使用庫函數(shù)信息,程序運行過程中需要利用庫函數(shù)n 動態(tài)庫:共享庫的一種變化形式,目前大都采用共享庫的方式n 命名方式: 靜態(tài)庫:前綴lib+庫名+.a(libm.a,libstdc+.a等) 共享庫:前綴lib+庫名+.so+版本

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論