操作系統(tǒng)中的應(yīng)用介紹上計(jì)劃
在為L(zhǎng)inux開(kāi)發(fā)應(yīng)用程序時(shí),絕大多數(shù)情況下使用的都是C語(yǔ)言,因此幾乎每一位Linux程序員面臨的首要問(wèn)題都是如何靈活運(yùn)用C編譯器。目前Linux 下最常用的C語(yǔ)言編譯器是GCC(GNU Compiler Collection),它是GNU項(xiàng)目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯用C、C++和Object C等語(yǔ)言編寫的程序。GCC不僅功能非常強(qiáng)大,結(jié)構(gòu)也異常靈活。最值得稱道的一點(diǎn)就是它可以通過(guò)不同的前端模塊來(lái)支持各種語(yǔ)言,如Java、 Fortran、Pascal、Modula-3和Ada等。 開(kāi)放、自由和靈活是Linux的魅力所在,而這一點(diǎn)在GCC上的體現(xiàn)就是程序員通過(guò)它能夠更好地控制整個(gè)編譯過(guò)程。在使用GCC編譯程序時(shí),編譯過(guò)程可以被細(xì)分為四個(gè)階段: ◆ 預(yù)處理(Pre-Processing) ◆ 編譯(Compiling) ◆ 匯編(Assembling) ◆ 鏈接(Linking) Linux程序員可以根據(jù)自己的需要讓 GCC在編譯的任何階段結(jié)束,以便檢查或使用編譯器在該階段的輸出信息,或者對(duì)最后生成的二進(jìn)制文件進(jìn)行控制,以便通過(guò)加入不同數(shù)量和種類的調(diào)試代碼來(lái)為今后的調(diào)試做好準(zhǔn)備。和其它常用的編譯器一樣,GCC也提供了靈活而強(qiáng)大的代碼優(yōu)化功能,利用它可以生成執(zhí)行效率更高的代碼。 GCC提供了30多條警告信息和三個(gè)警告級(jí)別,使用它們有助于增強(qiáng)程序的穩(wěn)定性和可移植性。此外,GCC還對(duì)標(biāo)準(zhǔn)的C和C++語(yǔ)言進(jìn)行了大量的擴(kuò)展,提高程序的執(zhí)行效率,有助于編譯器進(jìn)行代碼優(yōu)化,能夠減輕編程的工作量。 GCC起步 在學(xué)習(xí)使用GCC之前,下面的這個(gè)例子能夠幫助用戶迅速理解GCC的工作原理,并將其立即運(yùn)用到實(shí)際的項(xiàng)目開(kāi)發(fā)中去。首先用熟悉的器輸入清單1所示的代碼: 清單1:hello.c #include int main(void){printf (\"Hello world, Linux programming!\\\\n\");return 0;}
然后執(zhí)行下面的命令編譯和運(yùn)行這段程序: # gcc hello.c -o hello# ./helloHello world, Linux programming!
從程序員的角度看,只需簡(jiǎn)單地執(zhí)行一條GCC命令就可以了,但從編譯器的角度來(lái)看,卻需要完成一系列非常繁雜的工作。首先,GCC需要調(diào)用預(yù)處理程序 cpp,由它負(fù)責(zé)展開(kāi)在源文件中定義的宏,并向其中插入“#include”語(yǔ)句所包含的內(nèi)容;接著,GCC會(huì)調(diào)用ccl和as將處理后的源代碼編譯成目標(biāo)代碼;最后,GCC會(huì)調(diào)用鏈接程序ld,把生成的目標(biāo)代碼鏈接成一個(gè)可執(zhí)行程序。 為了更好地理解GCC的工作過(guò)程,可以把上述編譯過(guò)程分成幾個(gè)步驟單獨(dú)進(jìn)行,并觀察每步的運(yùn)行結(jié)果。第一步是進(jìn)行預(yù)編譯,使用-E參數(shù)可以讓GCC在預(yù)處理結(jié)束后停止編譯過(guò)程: # gcc -E hello.c -o hello.i
喜歡從自己的角度出發(fā) 此時(shí)若查看p文件中的內(nèi)容,會(huì)發(fā)現(xiàn)stdio.h的內(nèi)容確實(shí)都插到文件里去了,而其它應(yīng)當(dāng)被預(yù)處理的宏定義也都做了相應(yīng)的處理。下一步是將hello.i編譯為目標(biāo)代碼,這可以通過(guò)使用-c參數(shù)來(lái)完成: # gcc -c hello.i -o hello.o
GCC默認(rèn)將.i文件看成是預(yù)處理后的C語(yǔ)言源代碼,因此上述命令將自動(dòng)跳過(guò)預(yù)處理步驟而開(kāi)始執(zhí)行編譯過(guò)程,也可以使用-x參數(shù)讓GCC從指定的步驟開(kāi)始編譯。最后一步是將生成的目標(biāo)文件鏈接成可執(zhí)行文件: # gcc hello.o -o hello
商丘白癜風(fēng)哪里治療好重慶治療早泄多少錢
孩子不吃飯?jiān)趺崔k
- “裴娜”粗毛俊杰玩變裝,穿吊帶細(xì)腰太搶鏡,耳飾夸張遮住半只耳朵
- 六安四位中學(xué)老師寫的高考作文,問(wèn)你來(lái)“閱卷”……
- 臺(tái)當(dāng)局派團(tuán)赴帕勞開(kāi)會(huì)炒“任職期間突破” 返臺(tái)后12人感染新冠
- 千萬(wàn)不要隨便穿著肉色的衣服…哈哈哈哈狠狠代入了!
- 中華民族新能源汽車數(shù)量突破1000萬(wàn)輛
- 美國(guó)人吃飽漢堡所以肥胖,為何我們也常吃飽卻不胖?看手里漢堡我哭了
- 4.2億元!晉中又一輪消費(fèi)券來(lái)了,5月21日開(kāi)搶
- 有哪些考場(chǎng)提分的心理學(xué)基礎(chǔ)知識(shí)?
- 喜歡這樣和你開(kāi)“玩笑”的女人們,并非撩你,而是動(dòng)了真情
- 自制豆腐,干凈零加到,比做豆?jié){多2步,記住2個(gè)比例,不比買的差
- 如何從裝修外邊完美逆襲?不做冤大頭從我做起 !
- 孫悟空為何很少下水?真的是水性不好?其實(shí)是責(zé)怪他報(bào)復(fù)