資源描述:
《第6講 linux編程基礎(chǔ)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、Linux編程基礎(chǔ)Linux下的程序設(shè)計(jì)主要指C程序設(shè)計(jì),它與其他環(huán)境中的C程序設(shè)計(jì)一樣,主要涉及到編輯器、編譯鏈接器、調(diào)試器及項(xiàng)目管理工具。GCC編譯器GCC編譯器能將C、C++語(yǔ)言源程序、匯編程序和目標(biāo)程序編譯、連接成可執(zhí)行文件,如果沒(méi)有給出可執(zhí)行文件的名字,GCC將生成一個(gè)名為*.out的文件。在Linux系統(tǒng)中,編譯器通過(guò)程序的擴(kuò)展名可分辨出編寫(xiě)原始程序代碼所用的語(yǔ)言,由于不同程序所需要執(zhí)行編譯的步驟是不同的。因此GCC可根據(jù)不同的擴(kuò)展名對(duì)它們進(jìn)行分別處理,擴(kuò)展名文件類(lèi)型后續(xù)編譯流程.cC語(yǔ)言源代碼文件預(yù)處理、編譯、匯編、鏈接.C/.cc/.cxxC++源代碼文件預(yù)處理、
2、編譯、匯編、鏈接.mObjective-C源代碼文件預(yù)處理、編譯、匯編、鏈接.i已經(jīng)預(yù)處理過(guò)的C源代碼文件編譯、匯編、鏈接.ii已經(jīng)預(yù)處理過(guò)的C++源代碼文件編譯、.s匯編語(yǔ)言源代碼文件匯編、鏈接.S經(jīng)過(guò)預(yù)編譯的匯編語(yǔ)言源代碼文件匯編、鏈接.a由目標(biāo)文件構(gòu)成的檔案庫(kù)文件鏈接.o編譯后的目標(biāo)文件鏈接.h程序所包含的頭文件GCC所支持的擴(kuò)展名文件GCC編譯過(guò)程在使用GCC編譯程序時(shí),整個(gè)編譯過(guò)程可以被細(xì)分為四個(gè)階段。預(yù)處理(Pre-Processing)編譯(Compiling)匯編(Assembling)鏈接(Linking)基本語(yǔ)法格式gcc[選項(xiàng)]準(zhǔn)備編譯的文件[選項(xiàng)][目標(biāo)文
3、件]下面以一個(gè)具體的C程序?qū)嵗齺?lái)分析這四個(gè)階段。文件名為hello.c,程序清單如下:#includeintmain(){printf("Hello,mydearfriend!");return(0);}GCC編譯實(shí)例預(yù)處理階段執(zhí)行命令[root@vm-devmyprg]#gcc-Ehello.c-ohello.i“-E”指定只進(jìn)行預(yù)處理,“hello.c”是源程序文件,“-o”指定生成目標(biāo)文件,“hello.i”是預(yù)處理過(guò)程生成的目標(biāo)文件。預(yù)處理階段對(duì)預(yù)處理文件hello.i進(jìn)行編譯。[root@vm-devmyprg]#gcc-Shello.i-ohel
4、lo.S“-S”指定只進(jìn)行到編譯階段,“hello.i”是進(jìn)行編譯的源文件,“-o”指定生成目標(biāo)文件,“hello.S”是編譯生成的目標(biāo)文件名。編譯階段編譯階段[root@vm-devmyprg]#gcc-chello.S-ohello.o“-c”指定只進(jìn)行到匯編階段結(jié)束為止,“hello.S”是進(jìn)行匯編的源文件,“-o”指定生成目標(biāo)文件,“hello.o”是編譯生成的目標(biāo)文件名。hello.o為二進(jìn)制目標(biāo)代碼文件。匯編階段在成功編譯之后,就進(jìn)入了鏈接階段。在這里涉及到一個(gè)重要的概念:函數(shù)庫(kù)。在這個(gè)程序中并沒(méi)有定義“printf”的函數(shù)實(shí)現(xiàn),且在預(yù)編譯中包含進(jìn)的“stdio.h”
5、中也只有該函數(shù)的聲明,而沒(méi)有定義函數(shù)的實(shí)現(xiàn),系統(tǒng)把這些函數(shù)實(shí)現(xiàn)都被做到名為libc.so.6的庫(kù)文件中去了,在沒(méi)有特別指定時(shí),Gcc會(huì)到系統(tǒng)默認(rèn)的搜索路徑“/usr/lib”下進(jìn)行查找,也就是鏈接到libc.so.6庫(kù)函數(shù)中去,這樣就能實(shí)現(xiàn)函數(shù)“printf”了,而這也就是鏈接的作用。鏈接階段函數(shù)庫(kù)一般分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩種。靜態(tài)庫(kù)是指編譯鏈接時(shí),把庫(kù)文件的代碼全部加入到可執(zhí)行文件中,因此生成的文件比較大,但在運(yùn)行時(shí)也就不再需要庫(kù)文件了。其后綴名一般為“.a”。動(dòng)態(tài)庫(kù)與之相反,在編譯鏈接時(shí)并沒(méi)有把庫(kù)文件的代碼加入到可執(zhí)行文件中,而是在程序執(zhí)行時(shí)運(yùn)行鏈接文件加載庫(kù),這樣可以節(jié)省系統(tǒng)
6、的開(kāi)銷(xiāo)。動(dòng)態(tài)庫(kù)一般后綴名為“.so”,如前面所述的libc.so.6就是動(dòng)態(tài)庫(kù)。GCC在編譯時(shí)默認(rèn)使用動(dòng)態(tài)庫(kù)。函數(shù)庫(kù)完成了鏈接之后,GCC就可生成可執(zhí)行文件:[root@vm-devmyprg]#gcchello.o-ohello該命令gcc之后無(wú)選項(xiàng)參數(shù),表示對(duì)指定的源文件進(jìn)行編譯,直到輸出執(zhí)行文件(示例中的源文件為hello.o,輸出的執(zhí)行文件hello)。運(yùn)行該可執(zhí)行文件[root@vm-devmyprg]#./hello鏈接階段[root@vm-devmyprg]#gccfoo1.cfoo2.c-ofoo對(duì)于源文件不止一個(gè)情況,GCC編譯過(guò)程仍然按照預(yù)處理、編譯、匯編和鏈
7、接的過(guò)程依次進(jìn)行。因此,上面這條命令相當(dāng)于依次執(zhí)行如下三條命令。[root@vm-devmyprg]#gcc-cfoo1.c-ofoo1.o[root@vm-devmyprg]#gcc-cfoo2.c-ofoo2.o[root@vm-devmyprg]#gccfoo1.ofoo2.o-ofoo同時(shí)編譯多個(gè)文件GCC編譯選項(xiàng)介紹選項(xiàng)作用-E只進(jìn)行預(yù)編譯,不做其他處理;-o指定編譯的輸出文件;-S只編譯到匯編階段,生成匯編代碼;-c只編譯到鏈接階段,生成目標(biāo)文件“.o”;-g在可執(zhí)行