树莓派交叉开发环境的搭建
什么是交叉编译
交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
为什么要用交叉编译
原因主要有以下几点:
- 目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;
- 目的平台上的资源贫乏,无法运行我们所需要编译器;
- 目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
环境介绍
PC 机环境为 Ubuntu 64位操作系统,Interx86架构 CPU
1 | dhd@dhd-pc:~$ uname -a |
树莓派环境为 RaspBian 32位操作系统,ARM架构 CPU
1 | pi@raspberrypi:~ $ uname -a |
下载交叉编译器
首先要确保有 git
1 | sudo apt-get install git |
在用户目录下建立 raspberrypi 目录
1 | mkdir raspberrypi |
从 github 下载所需的交叉编译器
1 | git clone https://github.com/raspberrypi/tools.git |
ps:github 下载过慢的可以将仓库导入到码云(gitee)再进行下载。
添加环境变量
在 ~/.bashrc 中加入以下内容
如果是 32 位
1 | export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin |
如果是 64 位
1 | export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin |
保存退出,执行
1 | source ~/.bashrc |
现在,终端运行如下命令,如果没有提示命令不存在,则说明安装成功
1 | arm-linux-gnueabihf-gcc -v |
我的运行结果如下:
编译一个HelloWorld
国际惯例,编译一个 HelloWorld
1 | arm-linux-gnueabihf-gcc test.c -o test |
运行结果如图,现在在PC机上是无法运行这个二进制文件的
建立 PC 和树莓派的通信方式
通过 scp 将生成的二进制文件复制到树莓派下,这里记录一下用 ssh 免密登录的配置过程
在 PC 机上执行
1 | ssh-keygen |
一路回车,最后会在用户目录下生成一个 .ssh 目录,将其中的公钥文件 id_rsa.pub 复制到树莓派下备用
1 | scp ~/.ssh/id_rsa.pub pi@192.168.123.123:/home/pi/ |
此处用户名和ip看各自情况而定。
在树莓派上执行
在树莓派的 .ssh 目录下新建一个 authorized_keys
文件,若已存在,跳过此步骤
1 | touch authorized_keys |
把刚才 scp 到树莓派下的 PC 机的公钥文件追加到 authorized_keys
末尾
1 | cat ~/id_rsa.pub >> ~/.ssh/authorized_keys |
现在,主机再 ssh 到树莓派将直接使用密钥验证,无需输入密码。
每次都要敲 ip 太麻烦?
在 PC 机 .ssh 目录下新建一个 config 文件,在其中配置如下信息:
1 | Host pi |
这样就可以通过主机名 pi 来访问到树莓派了,如下
1 | ssh pi |
运行HelloWorld
把上一步编译出的二进制文件复制到树莓派下
1 | scp test pi:/home/pi |
在树莓派上运行结果如下:
Makefile 文件编写
通过 Makefile 文件来更方便的进行编译和文件复制,以下是我写的一个简单的 Makefile 文件
1 | CC=arm-linux-gnueabihf-gcc |
下面是使用过程,还是很方便的