1. 程式人生 > >一步一步教你怎麼編譯GNU ARM GCC 交叉編譯器 arm-none-eabi-gcc

一步一步教你怎麼編譯GNU ARM GCC 交叉編譯器 arm-none-eabi-gcc

首先,對於編譯器這東西,我一向認為很高深,當然現在還是這麼認為,呵,所以呢,一般都是用別人編譯好的現成的編譯好版本。可是最近因為要在windows下面編譯u-boot的原因,因為找不到合適的arm編譯器,故只能自己編譯一個了。下面就是整個的編譯過程,一步步來吧。

在開始之前,還要說明一點,這裡所編譯的gnu arm gcc 編譯器,執行時是依賴於cygwin的,而且這也是我所需要的,至於為什麼,請看我的另一篇:如何實現在windows下面編譯u-boot裡面已經說了詳細的原因。如果你不想依賴於cygwin,那請直接用yagarto,或其他的windows版本的gnu arm gcc

吧。

1. 確定要編譯arm編譯器的型別和版本,下載合適的編譯器原始檔和庫原始檔

1)型別:arm-none-eabi-gcc

2)版本:Binutils-2.22Newlib-1.20.0GCC-4.7.1GDB-7.4.1insight-6.8.1

嘿嘿,這個版本的問題,我參考了yagarto 還有一些其他的版本,yagarto Eclipse + CDT作為程式碼編輯和除錯的前端,所有沒有編insight-6.8.1,我這時是編了,如果你不需要用insight來作為除錯的前端,你也不用編,只編前面四個就可以了。

3)下載所要的原始檔:

Binutils-2.22

Newlib-1.20.0

也可以通過CVS來獲得:

 cvs -z 9 -d :pserver:[email protected]:/cvs/src login

 {enter "anoncvs" as the password}

 cvs -z 9 -d :pserver:[email protected]:/cvs/src co newlib

GCC-4.7.1

GDB-7.4.1

insight-6.8.1

也可以通過CVS來獲得:

cvs -z9 -d :pserver:

[email protected]:/cvs/src login

[enter "anoncvs" as the password]

cvs -z9 -d :pserver:[email protected]:/cvs/src co -r gdb_6_8-branch insight

官網不變,下載地址這裡只是給出參考,感覺隨時會變,那時候就google或百度。

2. 編譯前的準備

編譯之前還要做幾件事:

(1) 準備好cygwin,並且裝好所需要的Mingw gcc 等軟體,主要是devel選項下的。

Cygwin下載請到 這裡我用的是cygwin-1.7.15-1的版本,目前最新版cygwin-1.7.16-1 ,差別不大。裝好後,編譯的時候如果提示要裝什麼,可以再裝,如果你的空間夠,把devel下全裝了也行。

(2) 建好編譯時所要的目錄:

首先,建一個用來存入編譯好的編譯器的目錄,建義在cygwin安裝目錄下建一下opt目錄,裡面建一個arm-gnu-tools目錄,比如我的cygwin是裝在:d:\cygwin,那麼我就建d:\cygwin\opt\arm-gnu-tools,這樣你就可以在cygwin下通過 /opt/arm-gnu-tools來訪問了

其次,再建一個目錄build-arm-tools,然後在建立build-binutils, build-gcc, build-gdb, build-newlib, 並且拷入原始檔,解壓縮。下面就是我建好目錄結構:

E:\build-arm-tools

 binutils-2.22.tar.bz2

 build_arm_tools.bat

 gcc-4.7.1.tar.bz2

 gdb-7.4.1.tar.bz2

 insight-6.8-1.tar.bz2

 newlib-1.20.0.tar.gz

├─build-binutils

├─build-gcc

├─build-gdb

├─build-insight

├─build-newlib

├─binutils-2.22

├─gcc-4.7.1

├─gdb-7.4.1

├─insight-6.8-1

└─newlib-1.20.0

一步一步教你怎麼編譯GNU <wbr>ARM <wbr>GCC <wbr>交叉編譯器 <wbr>arm-none-eabi-gcc

其中build_arm_tools.bat是我們要進行編譯要用到的指令碼,主要作用是設定一些環境變數,啟動cygwin環境,具體內容如下:

@echo off

set TARGET=arm-none-eabi

set PREFIX=/opt/arm-gnu-tools

set BIN_PATH=/opt/arm-gnu-tools/bin

set LANG=C.UTF-8

set CYGWIN_DIR=d:\cygwin

set PATH=%CYGWIN_DIR%\bin;%PATH%

set HOME=e:\build-arm-tools\

bash --login –i

雙擊啟動後顯示:

一步一步教你怎麼編譯GNU <wbr>ARM <wbr>GCC <wbr>交叉編譯器 <wbr>arm-none-eabi-gcc

(3) 確定編譯引數

這部分內容的話,我是參考了yagarto, GNUARM, WinARM, devkitARM, SysGcc_ARM等,CodeSourceryLinaro是基於linux庫的,所以無可比性,最後覺得yagarto的引數最好的,然後又在它的基礎上加了幾個,具體的如下:

--target=arm-none-eabi

--prefix=/opt/arm-gnu-tools

--disable-nls

--disable-threads

--enable-languages=c,c++

--enable-interwork

--with-gcc

--with-gnu-ld

--with-gnu-as

--with-dwarf2

--with-float=soft

--disable-shared

--with-newlib

--enable-multilib

--disable-libssp

--disable-libstdcxx-pch

--disable-libmudflap

--disable-libgomp –v

--with-headers=../newlib-1.20.0/newlib/libc/include

--with-pkgversion='semilog_ARM release 01'

--enable-target-optspace

--with-cpu=cpu

--with-arch=armv7

下面就分別對(我知道的)引數說明一下吧:

--target=arm-none-eabi

 所要生成的目標編譯器,這裡是 arm-none-eabi,它的命名差不多是這樣的 arch-vendor[-os]-eabi-gcc , 對於這裡沒有os,因為沒有加入linux下的glibc,而是用的newlib,用於編os或者bootloader

--prefix=/opt/arm-gnu-tools

編譯好生成的編譯器存放的地方,比如,編好了,就會在arm-gnu-tools目錄下生成所要編譯器。

--disable-nls

這個引數真他媽坑爹,網上找到的說法是“這個引數禁止了國際化”,我怎麼看也不明白,結果在gcc reference book 上找到原文:Specifies that Native Language Support (NLS) be included as part of the compiler to allow for the display of warning and error messages in languages other than American English這才明白,意思大概是:編譯時只使用英語來作為提示警告和錯誤訊息的語言,而不使用本地語言。比如我們編譯時,提示也不會成中文。我真想抽那個第一個把它說成“禁止國際化的人”,這不是誤人子弟麻~~~

--disable-threads

這個引數等價於--enable-threads=single,而可以看到linux下的gcc的引數中寫差—enable-threads=posix,具體的我也不知道什麼意思,多半是支援多執行緒。

--enable-languages=c,c++