高手總結(jié)嵌入式Linux GCC常用命令_第1頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、高手總結(jié)嵌入式linux gcc常用命令1.簡介 gcc 的意思也只是 gnu c compiler 而已。經(jīng)過了這么多年的進展,gcc 已經(jīng)不僅僅能支持 c 語言;它現(xiàn)在還支持 ada 語言、c+ 語言、java 語言、objective c 語言、pascal 語言、cobol語言,以及支持函數(shù)式編程和規(guī)律編程的 mercury 語言,等等。而 gcc 也不再單只是 gnu c 語言編譯器的意思了,而是變成了 gnu compiler collection 也即是 gnu 編譯器家族的意思了。另一方面,說到 gcc 對于操作系統(tǒng)平臺及硬件平臺支持,概括起來就是一句話:無所不在。 2容易編譯

2、示例程序如下: /test.cinclude int main(void) printf("hello world!n"); return 0; 這個程序,一步到位的編譯命令是:gcc test.c -o test 實質(zhì)上,上述編譯過程是分為四個階段舉行的,即預(yù)處理(也稱預(yù)編譯,preprocessing)、編譯(compilation)、匯編 (assembly)和銜接(linking)。 2.1預(yù)處理 gcc -e test.c -o test.i 或 gcc -e test.c 可以輸出test.i文件中存放著test.c經(jīng)預(yù)處理之后的代碼。打開test.i文件,看一

3、看,就明了了。后面那條命令,是挺直在指令行窗口中輸出預(yù)處理后的代碼. gcc的-e選項,可以讓編譯器在預(yù)處理后停止,并輸出預(yù)處理結(jié)果。在本例中,預(yù)處理結(jié)果就是將stdio.h 文件中的內(nèi)容插入到test.c中了。 2.2編譯為匯編代碼(compilation) 預(yù)處理之后,可挺直對生成的test.i文件編譯,生成匯編代碼:gcc -s test.i -o test.sgcc的-s選項,表示在程序編譯期間,在生成匯編代碼后,停止,-o輸出匯編代碼文件。 2.3匯編(assembly)對于上一小節(jié)中生成的匯編代碼文件test.s,gas匯編器負(fù)責(zé)將其編譯為目標(biāo)文件,如下:gcc -c test.s

4、 -o test.o 2.4銜接(linking)gcc是gas提供的,負(fù)責(zé)將程序的目標(biāo)文件與所需的全部附加的目標(biāo)文件銜接起來,終于生成可執(zhí)行文件。附加的目標(biāo)文件包括靜態(tài)銜接庫和動態(tài)銜接庫。 對于上一小節(jié)中生成的test.o,將其與標(biāo)準(zhǔn)輸入輸出庫舉行銜接,終于生成程序testgcc test.o -o test 在指令行窗口中,執(zhí)行./test, 讓它說helloworld吧! 3.多個程序文件的編譯 通常囫圇程序是由多個源文件組成的,相應(yīng)地也就形成了多個編譯單元,用法gcc能夠很好地管理這些編譯單元。假設(shè)有一個由test1.c和 test2.c兩個源文件組成的程序,為了對它們舉行編譯,并終于

5、生成可執(zhí)行程序test,可以用法下面這條指令: gcc test1.c test2.c -o test 假如同時處理的文件不止一個,gcc仍然會根據(jù)預(yù)處理、編譯和鏈接的過程依次舉行。假如深究起來,上面這條指令大致相當(dāng)于依次執(zhí)行如下三條指令:gcc -c test1.c -o test1.ogcc -c test2.c -o test2.ogcc test1.o test2.o -o test 4.檢錯 gcc -pedantic illcode.c -o illcode -pedantic編譯選項并不能保證被編譯程序與ansi/iso c標(biāo)準(zhǔn)的徹低兼容,它僅僅只能用來協(xié)助程序員離這個目標(biāo)越來越

6、近。或者換句話說,-pedantic選項能夠協(xié)助程序員發(fā)覺一些不符合 ansi/iso c標(biāo)準(zhǔn)的代碼,但不是所有,實際上惟獨ansi/iso c語言標(biāo)準(zhǔn)中要求舉行編譯器診斷的那些狀況,才有可能被gcc發(fā)覺并提出警告。 除了-pedantic之外,gcc還有一些其它編譯選項也能夠產(chǎn)生實用的警告信息。這些選項大多以-w開始,其中最有價值的當(dāng)數(shù)-wall了,用法它能夠使gcc產(chǎn)生盡可能多的警告信息。 gcc -wall illcode.c -o illcode gcc給出的警告信息雖然從嚴(yán)格意義上說不能算作錯誤,但卻很可能成為錯誤的棲身之所。一個優(yōu)秀的linux程序員應(yīng)當(dāng)盡量避開產(chǎn)生警告信息,使自己

7、的代碼始終保持標(biāo)準(zhǔn)、茁壯的特性。所以將警告信息當(dāng)成編碼錯誤來對待,是一種值得稱贊的行為!所以,在編譯程序時帶上-werror選項,那么gcc會在全部產(chǎn)生警告的地方停止編譯,迫使程序員對自己的代碼舉行修改,如下: gcc -werror test.c -o test 5.庫文件銜接 開發(fā)軟件時,徹低不用法第三方函數(shù)庫的狀況是比較少見的,通常來講都需要借助許多函數(shù)庫的支持才干夠完成相應(yīng)的功能。從程序員的角度看,函數(shù)庫事實上就是一些頭文件(.h)和庫文件(so、或lib、dll)的集合。雖然linux下的大多數(shù)函數(shù)都默認(rèn)將頭文件放到/usr/include/名目下,而庫文件則放到/usr/lib/名

8、目下;windows所用法的庫文件主要放在visual stido的名目下的include和lib,以及系統(tǒng)文件夾下。但也有的時候,我們要用的庫不再這些名目下,所以gcc在編譯時必需用自己的方法來查找所需要的頭文件和庫文件。 例如我們的程序test.c是在linux上用法c銜接mysql,這個時候我們需要去mysql官網(wǎng)下載mysql connectors的c庫,下載下來解壓之后,有一個include文件夾,里面包含mysql connectors的頭文件,還有一個lib文件夾,里面包含二進制so文件libmysqlclient.so其中inclulde文件夾的路徑是/usr/dev/mysq

9、l/include,lib文件夾是/usr/dev/mysql/lib 5.1編譯成可執(zhí)行文件 首先我們要舉行編譯test.c為目標(biāo)文件,這個時候需要執(zhí)行g(shù)cc c i /usr/dev/mysql/include test.c o test.o 5.2鏈接 最后我們把全部目標(biāo)文件鏈接成可執(zhí)行文件:gcc l /usr/dev/mysql/lib lmysqlclient test.o o testlinux下的庫文件分為兩大類分離是動態(tài)鏈接庫(通常以.so結(jié)尾)和靜態(tài)鏈接庫(通常以.a結(jié)尾),二者的區(qū)分僅在于程序執(zhí)行時所需的代碼是在運行時動態(tài)加載的,還是在編譯時靜態(tài)加載的。 5.3強制鏈接時

10、用法靜態(tài)鏈接庫 默認(rèn)狀況下, gcc在鏈接時優(yōu)先用法動態(tài)鏈接庫,惟獨當(dāng)動態(tài)鏈接庫不存在時才考慮用法靜態(tài)鏈接庫,假如需要的話可以在編譯時加上-static選項,強制用法靜態(tài)鏈接庫。 在/usr/dev/mysql/lib名目下有鏈接時所需要的庫文件libmysqlclient.so和libmysqlclient.a,為了讓gcc在鏈接時只用到靜態(tài)鏈接庫,可以用法下面的指令:gcc l /usr/dev/mysql/lib static lmysqlclient test.o o test 靜態(tài)庫鏈接時搜尋路徑挨次:1. ld會去找gcc指令中的參數(shù)-l2. 再找gcc的環(huán)境變量library_path3. 再找內(nèi)定名目 /lib /usr/lib /usr/local/lib 這是當(dāng)時compile gcc時寫在程序內(nèi)的 動態(tài)鏈接時、執(zhí)行時搜尋路徑挨次:1. 編譯目標(biāo)代碼時指定的動態(tài)庫搜尋路徑2. 環(huán)境變量ld_library_path指定的

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論