Ubuntu實現樹莓派交叉編譯

1、交叉編譯html

      在一個平臺上生成另外一個平臺上的可執行代碼。爲何要大費周折的進行交叉編譯呢?一句話:不得已而爲之。有時是由於目的平臺上不容許或不可以安裝所須要的編譯器,而又須要這個編譯器的某些特徵;有時是由於目的平臺上的資源貧乏,沒法運行所須要的編譯器;有時又是由於目的平臺尚未創建,連操做系統都沒有,根本談不上運行什麼編譯器。
linux

      要進行交叉編譯,咱們須要在主機平臺上安裝對應的交叉編譯工具鏈(cross compilation tool chain),而後用這個交叉編譯工具鏈編譯源代碼,最終生成可在目標平臺上運行的代碼。git

     常見的交叉編譯例子以下:
一、在Windows PC上,利用ADS(ARM 開發環境),使用armcc編譯器,則可編譯出針對ARM CPU的可執行代碼。
二、在Linux PC上,利用arm-linux-gcc編譯器,可編譯出針對Linux ARM平臺的可執行代碼。
三、在Windows PC上,利用cygwin環境,運行arm-elf-gcc編譯器,可編譯出針對ARM CPU的可執行代碼。
 
2、名詞解釋
 
Linux下的大多數軟件包都使用Autoconf/Automake工具自動生成Makefile,只要使用「./configure」,「make」,「make install」就能夠把程序安裝到Linux系統中去了。 編譯第三方源代碼時,能夠看下工程中的readme和install文件,通常狀況下都會寫編譯步驟。
 
 一、./configure 常用參數  [--build] | [--host] | [--target] | [--prefix] | [--help]

注意:host和--host不是一個意思,host是指宿主機,即編輯和編譯程序的平臺,是個名詞;--host是設置執行文件所運行的主機,是個動詞。
 
>> ./configure: 用來生成對應的 Makefile;
 
>> --build: 執行代碼編譯的主機,正常的話就是你的主機系統。若無指定使用host的值;

>> --host: 編譯出來的二進制程序所執行的主機, 交叉編譯工具鏈的前綴。由於絕大多數是若是本機編譯就本機執行,因此這個值就等於build。可是交叉編譯的時候build和host須要設置不一樣值,用host指定運行主機,即host != build的時候編譯纔是交叉編譯。若無指定將會運行`config.guess'來檢測;
 
>> --prefix: 安裝目錄,好比 --prefix=/usr 意思是將該軟件安裝在 /usr 下面,執行文件就會安裝在 /usr/bin (而不是默認的 /usr/local/bin),資源文件就會安裝在 /usr/share(而不是默認的/usr/local/share);
 
>> --help: 查看參數;
 
>> --target: 這個參數比較特殊,表示須要處理的目標平臺名稱,主要在程序語言工具如編譯器和彙編器上下文中起做用,若無指定使用host的值。通常用來編譯工具,好比給arm開發板編譯一個能夠處理mips程序的gcc,那麼--target=mips;
 
>>>> 舉例說明:編譯gcc
 
>> ./configure --build=i386-linux --host=arm-linux --target=mipsel-linux --prefix=$(pwd)/_install
 
用i386-linux的編譯器進行gcc的編譯,編譯出的gcc運行在arm-linux, 編譯結果存放到$(pwd)/_install路徑下,編譯出的gcc用來編譯可以在mipsel-linux下運行的代碼。
 
二、Makefile包含了一些基本的預先定義的操做:

>>make: 根據Makefile編譯源代碼,鏈接,生成目標文件,可執行文件;github

>>make clean: 清除上次的make命令所產生的object文件(後綴爲「.o」的文件)及可執行文件;sql

>>make distclean: 相似make clean,但同時也將configure生成的文件所有刪除掉,包括Makefile;bash

>>make test / make check: 檢查make,確保make沒有出錯,通常在make install以前執行;curl

>>make install: 將編譯成功的可執行文件安裝到指定目錄中,通常爲/usr/local/bin目錄;工具

>>make dist: 產生髮布軟件包文件(即distribution package)。這個命令將會將可執行文件及相關文件打包成一個tar.gz壓縮的文件用來做爲發佈軟件的軟件包。它會在當前目錄下生成一個名字相似「PACKAGE-VERSION.tar.gz」的文件。PACKAGE和VERSION,是咱們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION);測試

 

>>make distcheck: 生成發佈軟件包並對其進行測試檢查,以肯定發佈包的正確性。這個操做將自動把壓縮包文件解開,而後執行configure命令,而且執行make,來確認編譯不出現錯誤,最後提示你軟件包已經準備好,能夠發佈了;ui

 
3、交叉編譯源代碼
一、環境
Ubuntu
 
二、樹莓派交叉編譯工具安裝

step1. 下載樹莓派交叉編譯工具https://github.com/raspberrypi/tools

step2. 將源碼放到各用戶都能share的文件夾下,如/usr/tools

step3. 將交叉編譯工具的路徑加到環境變量中,爲了之後啓動不用再設置,我加到了/etc/bash.bashrc中

1 $gedit /etc/bash.bashrc2 #在文件的末尾加上: export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
3 $source /etc/bash.bashrc

step4. 檢測是否安裝成功

way1: 

$arm #雙tab

顯示如下內容

way2:

$arm-linux-gnueabihf-gcc -v #能顯示正確信息

$arm-linux-gnueabihf-g++ -v #能顯示正確信息


注意:交叉編譯時,若是出現arm-linux-gnueabihf-XXX找不到,肯定arm-linux-gnueabihf-XXX -v 是否能輸出正確信息;

若是-v顯示「No such file or diectory」, 多是32位/64位兼容問題,解決辦法:

 13.10以前版本

//安裝32位兼容庫
1
apt-get install ia32-libs

 13.10以後版本

1 $ dpkg --add-architecture i386
2 $ apt-get update
3 $ sudo apt-get install lib32z1-dev
4 $ sudo apt-get install libgtk2.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 libidn11:i386 libasound2:i386 libasound2-plugins:i386 gstreamer0.10-pulseaudio:i386 gstreamer0.10-plugins-base:i386 gstreamer0.10-plugins-good:i386 gstreamer0.10-ffmpeg:i386
5 $ sudo apt-get install ia32-libs

 

 

 

3、編譯源代碼

一、在寫編譯腳本時,必定要確保編譯器寫的是交叉編譯的編譯器。好比比較經常使用的Makefile,

1 demo: $(obj) 2     $(CXX) -o $@ $^ $(LDFLAGS)

其中的CXX必須是arm-linux-gnueabihf-g++才能編譯出正確的在樹莓派上的可執行文件。

二、編譯第三方庫

若是你想設置全局的CC和CXX變量,在每次打開一個新的Terminal時,輸入如下命令:

1 $export CC=arm-linux-gnueabihf-gcc 2 $export CXX=arm-linux-gnueabihf-g++ 

其餘的全局變量同上。

如下列幾個經常使用的第三方庫交叉編譯步驟

1>> sqlite3 http://www.sqlite.org/download.html sqlite-autoconf-3081002.tar.gz

step1:  make clean

step2:  ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/tools/sqlite3

step3:  make

step4:  make install

 

2>>curl http://curl.haxx.se/download.html  curl-7.43.0.tar.gz

step1:  make clean

step2:  ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/tools/curl

step3:  make

step4:  make install

 

3>> openssl: http://www.openssl.org/source/ openssl-1.0.1p.tar.gz

step1: ./config no-asm shared --prefix=/usr/local/tools/openssl

step2:  a、修改Makefile CC=arm-linux-gnueabihf-gcc

     b、找到有-m64的地方,將-m64刪除。  

step3: make

step4: make install

相關文章
相關標籤/搜索