何为交叉编译?
所谓交叉编译简单的说,就是在一个平台上编译出在另一个在平台能跑的可执行程序。比如,本文的情况是,在windows上编译出在树莓派上能跑的可执行程序。(其中,windows是运行在x86的cpu上,而树莓派是arm的cpu。)
树莓派上已经有gcc了,为什么还要用交叉编译这种方式呢?
因为,树莓派的运行速度是比较慢的,而我们的PC机运行速度比较快,如果编译都在树莓派上做,那么就只有慢慢等了。
教程目标:
在windows平台上,搭建出树莓派的交叉编译环境
教程器材及软件:
- 树莓派的板子。
- SD卡(已经有镜像刷入)。
- 电源线及USB充电器。
- cygwin。
- 有DHCP的网线。
步骤:
cygwin:
- 下载cygwin(http://www.cygwin.com/)。
- 安装cygwin,途中需要看看,稍作选择。(其中,源选择163的可能会快一些。)
- 其中要特别选择一下ssh,还有mintty,以便之后要用。其他就默认吧。当然,如果漏过了什么也可以重新打开这个程序,选择想要的,再安装一遍。
- 这样装完了可能会出现一个错误,叫pango1.0.sh exit code 1之类的,那么你需要进入到c:\cygwin\etc下面建一个文件夹叫pango,然后再执行一遍上面的过程,应该就没事了。(这就是个bug,pango他们已经在改了)这样装完了,其实默认的gcc等一系列的东西是没有,如果想要可以回去再选择再安装。
arm tool-chain:
- 到https://github.com/IanLinsdell/Raspberrypi去下载编译好的工具链。其实是可以在cygwin中编译出工具链的,但是,听同学说,他在linux上花了2个小时和4G+硬盘空间去编译,那还不如下一个现成的。
- 下载后,解开压缩,有两个选择一个是hardfp,另一个是softfp。(目前,我也不知道有什么区别。我用的是hardfp,之后试了一下浮点好像没有问题。)将你的选择解压缩后放到cygwin下面,形成这样的目录结构。c:\cygwin\opt\cross\x-tools\arm-unknown-linux-gnueabi。并在环境变量PATH中加入,c:\cygwin\opt\cross\x-tools\bin\
测试:
- 打开mintty,建一个hello.cpp,然后,写一个经典的helloworld,之后编译一下
如果,好运的话,没有什么错误。(我之前尝试其他编译出来的工具链,不断地出错。)arm-unknown-linux-gnueabi-g++ hello.cpp
- 用sftp命令将a.out上传到树莓派上,然后用ssh登录后运行它。
后记:
在这过程中,不断地出错,不断地上网去查,也不知道参考了多少。不能像linux下一样,有比较多的教程,剩下的只是等待的时间。也发现了许多开源软件的bug和问题,令人十分烦恼,比如下面这个。
但不管怎么样,我还是得感谢开源,感谢为开源做出贡献的人,感谢那些在网上分享出自己的知识的人。
参考:
http://www.a2p.it/wordpress/tech-stuff/development/remote-debugging-raspberrypi/
备注:
此教程为浙江大学计算机学院嵌入式课程的实验二实验报告。