树莓派与交叉编译

Posted by Hsz on February 22, 2018

树莓派和交叉编译

树莓派的性能弱鸡,造成的一个很大的问题就是编译一些软件非常的慢,这时候交叉编译技术就有了用武之地.

交叉编译工具

交叉编译工具是针对执行二进制文件的平台而选择,对于树莓派有专门的交叉编译工具https://github.com/raspberrypi/tools

通常我们用gcc作为交叉编译的编译器

交叉编译环境

  • linux 和 windows

    windows对于交叉编译的支持最差,但因为win10内置ubuntu,所以可以直接使用这个ubuntu进行交叉编译.内置ubuntu的开启方式可以看这篇文章

    linux下可以使用sudo apt-get install build-essential安装整个编译环境,不需要其他额外的设置

    依赖装好后就将官方的交叉编译工具下载到本地

      git clone https://github.com/raspberrypi/tools.git
    

    或者使用wget下载zip格式的项目

      wget https://codeload.github.com/raspberrypi/tools/zip/master
      unzip master -d tools
    

    这样tools/tools-master下就是项目目录.项目目录arm-bcm2708下有可用的交叉编译工具

      arm-bcm2708hardfp-linux-gnueabi  arm-linux-gnueabihf            gcc-linaro-arm-linux-gnueabihf-raspbian
      arm-bcm2708-linux-gnueabi        arm-rpi-4.9.3-linux-gnueabihf  gcc-linaro-arm-linux-gnueabihf-raspbian-x64
    

    对于32位的系统,使用gcc-linaro-arm-linux-gnueabihf-raspbian,

    对于64位的使用gcc-linaro-arm-linux-gnueabihf-raspbian-x64或者arm-rpi-4.9.3-linux-gnueabihf.

    在此选择64位上的交叉编译工具gcc-linaro-arm-linux-gnueabihf-raspbian-x64.

  • mac

    mac下无法使用官方工具,不过好在有人为这个需求编译好了gcc4.9,感谢大大!

    解压好后直接就可使用.解压好后bin文件夹下有很多工具.我们使用arm-rpi-linux-gnueabihf-gccarm-rpi-linux-gnueabihf-g++

添加环境变量

要使用交叉编译工具需要添加环境变量.

export RPI_CROSS_COMPILE=/<your path to>/<arm-linux-gnueabihf-gcc/arm-rpi-linux-gnueabihf-gcc>
export PATH=$RPI_CROSS_COMPILE/bin:$PATH

之后使用source ~/.zshrc使环境变量立即生效 这样就可以直接使用交叉编译工具了

<arm-linux-gnueabihf-gcc/arm-rpi-linux-gnueabihf-gcc> -v

查看gcc版本以测试是否配置成功

简单的例子

我们新建一个项目test_ccp用于测试交叉编译是否有效:

test_ccp目录下创建文件

  • hello.c

      #include <stdio.h>
      int main(void)
      {
          float pi = 3.14;
          printf("Hello World\n");
          printf("%.2f\n",2*pi);
      }
    
  • Makefile

      CC=arm-linux-gnueabihf-gcc # mac 下是arm-rpi-linux-gnueabihf-gcc
      hello:hello.o
      clean:
          rm -rf hello.o hello
    

    CC用于指定编译的工具链

之后执行make,就会创建出一个hello文件来,这个文件在当前息系统下是无法执行的,我们将其复制到树莓派上scp hello pi@xxxx:~/hello.

之后登录树莓派执行hello这个文件就可以看到它正确的执行了.