編譯原理及交叉編譯

2021-07-11 21:35:34 字數 1949 閱讀 4555

編譯原理及交叉編譯

編譯原理

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 ...