gcc是“GNU Compiler Collection”的縮寫,從字面意思可以知道它是一個編譯器集。gcc不止可以編譯器c語言,還能用於c++,java,object-C等語言程序。但是在這里,我們的嵌入式學習中,目前只去關注gcc在C語言方面的編譯功能。
.什么是交叉編譯器
在嵌入式系統開發中,經常用到與交叉編譯相關的術語,例如:交叉編譯器,交叉連接器,交叉編譯環境等。
嵌入式產品的資源往往有限,如果它的資源和我們平時用的桌面計算機(后面稱為開發主機或簡稱主機,host machine)一樣,那就不需要交叉編譯了。嵌入式系統的內存通常是幾十兆字節,且只有閃存而沒有硬盤這種大容量存儲設備。在這種資源有限的環境中,不可能將開發工具安裝在嵌入式設備中(后面稱為目標機,target machine),然后像平時做桌面軟件開發那樣在嵌入式設備上直接進行軟件開發,因此,嵌入式的開發工作一般是在主機上進行的。
那么當目標機的處理器和主機的處理器不同時(比如目標機是ARM處理器,而主機是X86處理器),如何保證在主機上編譯的程序可以在目標機上運行呢?
當使用編譯gcc時,需要指定目標機處理器和主機處理器型號,如果不加以指定,則認為主機與目標機是一樣的,且與當前編譯它的環境一致。如果在gcc編譯時,指定主機與目標機處理器型號不一致,則生成的編譯器就是交叉編譯器(cross compiler),即生成的編譯器將在指定主機上進行編譯活動,但在編譯器生成的程序卻運行於目標機上。
gcc會對代碼完成預處理,編譯,匯編和鏈接四個步驟。
這里注意:匯編文件的后綴是s(小s)表示:在后期階段不在進行預處理操作,所以我們不能在這里面寫預處理的語句在里面;匯編文件的后綴是S(大S)表示:會進行預處理、匯編等操作,所以我們可以在這里面加入預處理的命令。
gcc實用選項:
-S:生成匯編
-I:指定頭文件路徑
-g:包含調試信息
-On:n=0~3,編譯器優化,n越大優化等級越高
-Wall:提示更多的警告信息
-D:編譯器時定義宏,注意-D和宏之間沒有空格
-E:生成預處理文件
-c:只編譯,不鏈接
-C 告訴預處理器不要丟棄注釋。配合`-E'選項使用。
-M:生成與.c和頭文件的依賴關系以用於Makefile,包括系統庫的頭文件
-MM:生成與.c和頭文件的依賴關系以用於Makefile,不包括系統庫的頭文件
-o:生成目標文件。eg: -o filename。將經過gcc處理的結果保存為filename。如果這個選項被忽略,生成的可執行文件默認為a.out,,假設源文件為file.c,目標文件默認為file.o,匯編文件默認為file.s。
gcc -v可以查看gcc的版本信息,但是要是在gcc -v 后面加上一個源文件例如,gcc -v main.c,這樣可以獲得gcc所使用的系統頭文件。
加上源文件選項 :
產生映射文件
gcc的-Wl選項用於指定傳遞給連接器的選項,-Map=main.map選項由gcc傳遞給連接器以只是連接器為我們生成名為main.map的映射文件。在使用-Wl選項時,如果后面的選項如有多個,則需要用逗號分開。
映射文件除了包含nm工具獲取的信息外,還包含了各符號來源於哪一個庫以及庫中的哪一個目標文件等更為詳細的信息。
在鏈接選項中:
參考鏈接:http://blog.chinaunix.net/uid-20528014-id-358180.html