交叉式編譯
1. 什麼是交叉編譯
簡單的說,如果你開發嵌入式,也就是製作小的帶MCU(CPU)的智能電子產品。你必須保證你在電腦上開發編譯出的代碼,在你的產品上也要能夠運行,這時就需要在你的電腦里安裝交叉編譯工具,實現上述功能。
2. 什麼是交叉編譯,為什麼要採用交叉編譯
在一個平台架構上,編譯另一個平台架構的可執行代碼,就是交叉編譯。
例如在x86架構的PC上編譯arm嵌入式設備的可執行程序。
交叉編譯是不得不用,
首先在目標設備的系統還沒引導起來的時候,編譯目標平台的引導程序,顯然只能交叉編譯。
還有因為目標設備往往能力太低,沒法安裝編譯器,或者勉強安裝了,也慢得像蝸牛。
3. 什麼是交叉編譯為什麼要使用交叉編譯
簡單地說,就是在一個平台上生成另一個平台上的可執行代碼。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86
linux平台實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平台實際上是Intel
x86體系結構和Windows NT for x86操作系統的簡稱。
4. 什麼是交叉編譯
由於嵌入式系統是藉助PC(宿主機)來進行編寫、編譯和調試程序的。宿主機一般是Linux系統,它編譯的程序是要在嵌入式系統上運行而非在宿主機本地運行,那麼宿主機需要使用某種特定的交叉編譯器,編譯出能在目標系統上運行的程序,這就是交叉編譯。
如你是初學嵌入式Linux,建議你看看ZLG致遠電子的開發板,資料比較齊全。
由於嵌入式系統是藉助PC(宿主機)來進行編寫、編譯和調試程序的。宿主機一般是Linux系統,它編譯的程序是要在嵌入式系統上運行而非在宿主機本地運行,那麼宿主機需要使用某種特定的交叉編譯器,編譯出能在目標系統上運行的程序,這就是交叉編譯。
如你是初學嵌入式Linux,建議你看看ZLG致遠電子的開發板,資料比較齊全。
5. 如何建立Linux下的ARM交叉編譯環境
首先安裝交叉編譯器,網路「arm-linux-gcc」就可以一個編譯器壓縮包。
把壓縮包放到linux系統中,解壓,這樣就算安裝好了交叉編譯器。
設置編譯器環境變數,具體方式網路。如打開 /etc/bash.bashrc,添加剛才安裝的編譯器路徑 export PATH=/home/。。。/4.4.3/bin:$PATH。這樣是為了方便使用,用arm-linux-gcc即可,不然既要帶全路徑/home//bin/arm-linux-gcc,這樣不方便使用。
編譯c文件。和gcc編譯相似,把gcc用arm-linu-gcc代替就是了。編譯出來的就可以放到arm上運行了。</ol>
6. 什麼是交叉編譯,為什麼要使用交叉編譯
交叉編譯的概念(來自網路):
簡單地說,就是在一個平台上生成另一個平台上的可執行代碼。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86 Linux平台實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平台實際上是Intel x86體系結構和Windows NT for x86操作系統的簡稱。
舉個例子:
我們在Linux系統比如Ubuntu上編寫的C程序完全可以拿到Windows系統上正常運行。
7. 如何實現protobuf在XCODE上armv7/armv7s/i386的交叉編譯 / 藍訊
步驟一:部署protoc.exe
1)sudo su ---進入管理模式
//以下操作切換至protobuf文件夾下
2)。/configure
3)make
4)make check
5)make install
此時可以查看protobuf文件夾下面的makefile文件,可以查看-build表示的本機環境以及-host表示的編譯庫的運行環境
我本地的-build=x86_64-apple-darwin12.3.0
-host=x86_64-apple-darwin12.3.0
(這兩個參數在後續配置腳本需要用到,與後面腳步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0後綴「arm-apple-darwin12.3.0」保持一致)
6)make distclean清理已生成的makefile,為交叉編譯配置新makefile做准備
步驟二:配置交叉編譯
1)執行腳本ios-build.sh,腳本內容如下:
configure_for_platform() {
export PLATFORM=$1
#export PLATFORM=iPhoneOS
echo 「Platform is ${PLATFORM}」
if [ 「$PLATFORM」 == 「iPhoneSimulator」 ]; then
export ARCHITECTURE=i386
export ARCH=i686-apple-darwin12.3.0
fi
if [ 「$PLATFORM」 == 「iPhoneOS」 ]; then
export ARCHITECTURE=$2
export ARCH=arm-apple-darwin12.3.0
fi
export ARCH_PREFIX=$ARCH-
export SDKVER=「6.1」
#sdk版本號必須正確
export
DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer
export SDKROOT=「$DEVROOT/SDKs/${PLATFORM}$SDKVER.sdk」
export
PKG_CONFIG_PATH=「$SDKROOT/usr/lib/pkgconfig:$DEVROOT/usr/lib/pkgconfig」
export AS=「$DEVROOT/usr/bin/as」
export ASCPP=「$DEVROOT/usr/bin/as」
export AR=「$DEVROOT/usr/bin/ar」
export RANLIB=「$DEVROOT/usr/bin/ranlib」
#export CPP=「$DEVROOT/usr/bin/c++」
#export CXXCPP=「$DEVROOT/usr/bin/c++」
export CC=「$DEVROOT/usr/bin/gcc」
export CXX=「$DEVROOT/usr/bin/g++」
export LD=「$DEVROOT/usr/bin/ld」
export STRIP=「$DEVROOT/usr/bin/strip」
export LIBRARY_PATH=「$SDKROOT/usr/lib」
export CPPFLAGS=「」
8. 交叉編譯的流程是什麼
採用交叉編譯的主要原因在於,多數嵌入式目標系統不能提供足夠的資源供編譯過程使用,因而只好將編譯工程轉移到高性能的主機中進行。
linux下的交叉編譯環境重要包括以下幾個部分:
1.對目標系統的編譯器gcc
2.對目標系統的二進制工具binutils
3.目標系統的標准c庫glibc
4.目標系統的linux內核頭文件慧模
交叉編譯環境的建立步驟
一、下載源代碼 下載包括binutils、gcc、glibc及linux內核的源代碼(需要注意的是,glibc和內核源代碼的版本必須與目標機上實際使用的版本保持一致),並設定shell變數PREFIX指定可執行程序的安裝路徑。
二、編譯binutils 首先運行configure文件,並使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,然後執行make install。
三、配置linux內核頭文件
首先執行make mrproper進行清理工作,然後執行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)進行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架構,因為預設架構為主機的cpu架構),這一步需要根據目標機的實際情況進行詳細的配置,筆者進行的實驗中目標機為HP的ipaq-hp3630 PDA,因而設置system type為SA11X0,SA11X0 Implementations中選擇Compaq iPAQ H3600/H3700。
配置完成之後,需要將內核頭文件拷貝到安裝目錄: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux
四、第一次編譯gcc
首先運行configure文件,團閉使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,並使用--disable-threads、--disable-shared、--enable-languages=c參數,然後執行make install。這一步將生成一個最簡的gcc。由於編譯整個gcc是需要目標機的glibc庫的,它現在還不存在,因此需要首先生成一個最簡的gcc,它只需要具備編譯目標機glibc庫的能力即可。
五、交叉編譯glibc
這一步驟生成的代碼是針對目標機cpu的,因此它屬於一個交叉編譯過程。該過程要用到linux內核頭文件,默認路徑為$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一個名為sys-linux的軟連接,使其內核頭文件所在的include目錄;或者,也可以在接下來要執行的configure命令中使用--with-headers參數指定linux內核頭文件的實際路徑。
configure的運行參數設置如下(因為是交叉編譯,所以要將編譯器變數CC設為arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最後,按以上配置執行configure和make install,glibc的交叉編譯過程就算完成了,這里需要指出的是,glibc的安裝路徑設置為$PREFIXARCH=arm/arm-linux,如果此處設置不當,第二次編譯gcc時可前或緩能找不到glibc的頭文件和庫。
六、第二次編譯gcc
運行configure,參數設置為--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。
運行make install。
到此為止整個交叉編譯環境就完全生成了。
幾點注意事項
第一點、在第一次編譯gcc的時候可能會出現找不到stdio.h的錯誤,解決辦法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS變數的設定中增加-Dinhibit_libc和-D__gthr_posix_h。