自己编译给树莓派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/

访问原文「自己编译给树莓派RaspberryPi的交叉编译工具」获取最佳阅读体验并参与讨论

虚拟机配置

基于最纯粹最小系统,改个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-ng

git 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版本

编译过程中要用到很多库,有几个比较关键的库的版本需要提前看好,否则可能导致编译失败。这个是要在树莓派的终端看的,不是指编译环境。

  1. Glibc版本:lld —v
  2. GCC版本:gcc —v
  3. 目标板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了。基于默认配置,需要修改的部分不多,重要的有以下几个:

    1. Paths and misc options —>
      [X] Try features marked as EXPERIMENTAL
      (3) Number of parallel jobs //同时进行编译的线程,如果机器好点的话可以改大点加快速度
    2. Toolchain options —>
      (rpi2) Tuple’s vendor string //一个标识符,会出现在最终编译工具的文件名上
    3. Operating System —>
      Linux kernel version() //内核版本,之前记录下来的
    4. C-library —>
      glibc version () // Glibc版本
    5. C compiler —>
      gcc version () //GCC版本
    6. 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……这么多关键的库都要重来,又不能影响系统,就算是写脚本做软链接也是相当浩大的工程。所以,如果不是对自己特别有信心,又特别爱折腾,我真心建议还是用虚拟机吧。