天天看點

樹莓派 交叉編譯 php,自己編譯給樹莓派RaspberryPi的交叉編譯工具

說到交叉編譯工具,真是血淚史。搞了快兩天,才終于迂回搞定。老規矩,先放Script傳送門,build/build-toolchain.sh

一開始我以為這東西用的人多,交叉編譯工具應該不是事兒,去官網下一個就行了,可是我去GitHub一看,這toolchain最近的更新也是三年前,這……能用?先下載下傳吧,同時各種搜,感覺我沒有走錯地方,大家就是用的這一款!

可是我忘了我是OSX。不出所料,在我的電腦上跑不了。而且看了下這個toolchain還是給ARMv6編的好嗎,現在明明就是ARMv7了!這麼跑性能不受影響嗎?更讓我無語的是闆子上的gcc也是ARMv6的……😰編譯個核心什麼的那麼慢,官方的toolchain又不能用,自己編譯勢在必行。

又是一通各種搜,搜到了個别人2014年編譯的mac用toolchain,試了試,普通的程式沒問題,編kernel編不過。搜到了個比較詳細的在Mac上編譯的blog,可惜也是幾年前的,跟現在的環境不一樣,各種出狀況又goole解決,最後還是編譯crosstool不成功。可能這一兩年,不論是crosstool,OSX,還是GCC,都已經又改了不少吧。

最後,我放棄了,畢竟還是要做iOS開發的,不敢随便亂sudo,還是上虛拟機吧。竭盡全力把所有能删的都删了,看看剩餘的18G空間(128G MBP你懂的),哭着做了個Debian的虛拟機……為了節約,GUI都不要,指令行的最小系統。後來還是吃虧在這上面了,編譯到一半空間不夠,臨時擴充磁盤,fdisk,format,mount,ln -s😞是以,根據我經驗,不管在哪裡,請至少至少至少準備10G有效空間!!!(12G是我調整後整個虛拟機大小,最後還剩了2G;如果系統已經有了,那free space至少8G)

廢話說完,正經操作其實不多,主要就是裝一個神器crosstool-ng,配置好,然後交給它編譯交叉編譯工具就行了!具體如下:你看到的是非授權版本!爬蟲兇猛,請尊重知識産權!

轉載請注明出處:http://conanwhf.github.io/2016/01/14/rpi-toolchain/

虛拟機配置

基于最純粹最小系統,改個vi,加個sudo賬戶,如果系統以前就用可以跳過。

sudo apt-get install -y vim

echo “deb ALL=(ALL) NOPASSWD: ALL” | sudo tee -a /etc/sudoers

環境準備

因為是新系統,要裝的庫實在太多,我一邊編,一邊google,無數次出錯了就多裝一個庫再來,這些是最精簡的要求了,一般的系統裡應該很多都已經裝了

sudo apt-get -y update

sudo apt-get install -y bison flex texinfo gawk automake subversion

sudo apt-get install -y gperf help2man make libtool libncurses5-dev

sudo apt-get install -y gcj-jdk python-dev g++

這個libtool我不知道為什麼,明明裝了卻總說沒裝,于是我自己手動裝了一遍。不過後來想想,可能應該裝libtool-dev?沒去驗證

git clone git://git.savannah.gnu.org/libtool.git

cd libtool

./configure; make; make install

編譯crosstool-nggit clone https://github.com/crosstool-ng/crosstool-ng.git

cd crosstool-ng

./bootstrap

./configure --prefix=/opt/crosstool-ng

make

make install

然後加環境變量export PATH=$PATH:/opt/crosstool-ng/bin

編譯交叉編譯工具(不能是root使用者)

檢查tools版本

編譯過程中要用到很多庫,有幾個比較關鍵的庫的版本需要提前看好,否則可能導緻編譯失敗。這個是要在樹莓派的終端看的,不是指編譯環境。

Glibc版本:lld —v

GCC版本:gcc —v

目标闆Kernel版本:uname -r。目前我用的最新版本是Linux-4.1.15

配置編譯選項首先去一個随便什麼地方(要有讀寫權限)建立一個檔案夾作為目前目錄,用來存放臨時的配置檔案mkdir toolchain

cd toolchain

crosstool-ng是有一些不同平台的default配置的,他們放在crosstool-ng/samples/$PLATFORM/crosstool.config。很幸運樹莓派2B正好是有預設配置的,可以用:

ct-ng armv7-rpi2-linux-gnueabihf

來調用,然後就會自動儲存為.config檔案,這個跟kernel有點像。

預設的配置還是有些地方需要調整,我們要手動配置一下:

ct-ng menuconfig

這裡面的界面就非常像Kernel的Config了。基于預設配置,需要修改的部分不多,重要的有以下幾個:

Paths and misc options —>

[X] Try features marked as EXPERIMENTAL

(3) Number of parallel jobs //同時進行編譯的線程,如果機器好點的話可以改大點加快速度

Toolchain options —>

(rpi2) Tuple’s vendor string //一個辨別符,會出現在最終編譯工具的檔案名上

Operating System —>

Linux kernel version() //核心版本,之前記錄下來的

C-library —>

glibc version () // Glibc版本

C compiler —>

gcc version () //GCC版本

Companion libraries —>

這裡面有一些其他的庫的版本選擇,不太會影響編譯成功與否,有需要可以改

最後看看還有什麼自己的特殊需要,例如目标Path之類,改完以後儲存

編譯

一句話:

ct-ng build

然後等着吧!首先還會下載下傳GCC之類的源碼,是以準備好網絡環境。如果沒有出錯的話,也要等個兩三個鐘頭。完成之後,會在~/xtool(預設設定)裡看到最終的交叉編譯工具。拿去用吧!我測試了普通程式、核心、驅動,都跑得好好的,搞定收工!😄

有關Mac的幾句話

關于Mac的OSX系統,多廢話兩句。在Mac上的crosstool-ng之是以用不了,一是因為很多工具沒有,二是即使有也太過于陳舊,第三點最重要:Mac上的GCC等一套工具并不是基于GNU的,而是Apple自己弄的Clang。雖然我們有brew這樣的神器,但GCC, grep, awk, libtool, automake……這麼多關鍵的庫都要重來,又不能影響系統,就算是寫腳本做軟連結也是相當浩大的工程。是以,如果不是對自己特别有信心,又特别愛折騰,我真心建議還是用虛拟機吧。