編譯原理及交叉編譯
編譯原理
gcc/g++在執行編譯的時候,只要分四個階段 :
1、預處理階段,完成巨集定義和include檔案展開等工作;不生成檔案 [預處理器cpp]
2、根據編譯引數進行不同程度的優化,編譯成彙編**;將預處理後的檔案轉換成組合語言,生成.s的檔案 [編譯器egcs]
3、用彙編器把彙編**進一步生成目標**;由彙編變為目標**(機器**)生成.o的檔案 [彙編器as]
4、用聯結器把生成的目標**和系統或使用者提供的庫連線起來,生成可執行檔案;[鏈結器ld]
gcc常用編譯選項:
-c 只生成object檔案,不鏈結
-s 只把檔案編譯成為彙編**
-e 只執行c預編譯器cpp,不生成檔案
-o 生成指定的輸出檔案
-g 生成可被gdb使用的標準除錯資訊
-idir 指定額外的標頭檔案搜尋路徑dir
-ldir 指定額外的庫函式搜尋路徑dir
-llibrary 指定鏈結時需要的其它函式庫
「library」
-w 不生成任何警告資訊
-wall 生成所有級別的警告資訊
-shared 生成支援動態共享庫的執行檔案
-static 不支援動態共享庫,把函式庫內容靜
態鏈結到可執行程式中
例如:有一main.c,**如下:
#include
void main()
編譯:第一階段:gcc –e main.c //列印出編譯資訊,但是沒有生成任何檔案
gcc main.c –e –o main.cpp //生成main.cpp的檔案
第二階段:gcc –s main.c //生成main.s的彙編檔案
第三階段:gcc –c main.c //生成main.o的目標檔案
第四階段:gcc main.c //直接生成檔名為預設的a.out的可執行檔案
gcc main.c –o main //生成檔名為main的可執行檔案
系統在編譯的時候,會在/usr/include中搜尋標頭檔案,在/lib,/usr/lib中搜尋庫檔案
gcc優化編譯選項:
-o0 不進行**優化處理
-o,o1 進行一般優化,減少大小和時間
-o2 進一步優化,一般在核心編譯時使用[一般建議]
-o3 較-o2進一步優化
gcc可以同時用來編譯c程式和c++程式。但gcc只能編譯c++原始檔,而不能自動和c++程式使用的庫鏈結。因此,通常使用g++完成c++程式的編譯和鏈結.
交叉編譯
要進行交叉編譯,我們需要在主機平台上安裝對應的交叉編譯工具鏈(cross compilation tool chain)
然後用這個交叉編譯工具鏈編譯我們的源**,最終生成可在目標平台上執行的**。
什麼是eabi?
即嵌入式應用二進位制介面,是描述可連線目標**,庫目標**,可執行檔案影像,如何連線,執行和除錯,以及目標**生成過程,和c, c++語言介面的規範,是編譯連線工具的基礎規範,也是研究它們工作原理的基礎
安裝交叉編譯工具
1、 複製原始碼包到linux系統的目錄中(通過smb伺服器)
2、 解壓,tar xzvf arm-******.gz –c/ 解壓到 usr/local/arm目錄下
3、 新增環境變數
vi /etc/profile
在export path user logname mail hostname histsize inputrc 後面加上
export path /usr.local/bin/arm/4.3.2/bin:$path //在bin中查詢可執行檔案
儲存退出
source /etc/profile //讓新增的環境變數生效
4、 交叉編譯安裝成功
5、 修改makefile中的編譯器
執行arm-linux-gcc main.c –o main //編譯
交叉編譯原理分析
什麼是交叉編譯 交叉編譯是指在一種環境 作業系統 晶元指令 中編譯另外一種環境的程式。名詞定義 host 執行編譯操作的環境 target 最終執行編譯結果的環境 有些什麼特殊的地方 編譯器一定是host中的程式,但是編譯器輸出的程式卻是是target中執行的。host上面不存在target中編譯或...
編譯 交叉編譯
交叉編譯含義 是指在乙個平台上生成另乙個平台上的可執行 同乙個體系結構可以執行不同的作業系統,同樣乙個作業系統也可以在不同的體系結構上執行 例 常說的x86 linux平台 指inter x86體系結構及linux for x86作業系統 x86 winnt平台 指inter x86體系結構及win...
交叉編譯 Go 交叉編譯 跨平台編譯
golang 支援交叉編譯,在乙個平台上生成另乙個平台的可執行程式 cgo enabled 0 goos linux goarch amd64 go build main.go cgo enabled 0 goos windows goarch amd64 go build main.go cgo ...