树莓派交叉开发环境的搭建

什么是交叉编译

交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

为什么要用交叉编译

原因主要有以下几点:

  • 目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;
  • 目的平台上的资源贫乏,无法运行我们所需要编译器;
  • 目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

环境介绍

PC 机环境为 Ubuntu 64位操作系统,Interx86架构 CPU

1
2
dhd@dhd-pc:~$ uname -a
Linux dhd-pc 5.0.0-36-generic #39~18.04.1-Ubuntu SMP Tue Nov 12 11:09:50 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

树莓派环境为 RaspBian 32位操作系统,ARM架构 CPU

1
2
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l GNU/Linux

下载交叉编译器

首先要确保有 git

1
sudo apt-get install git

在用户目录下建立 raspberrypi 目录

1
2
mkdir raspberrypi
cd 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

我的运行结果如下:
gccv

编译一个HelloWorld

国际惯例,编译一个 HelloWorld

1
2
arm-linux-gnueabihf-gcc test.c -o test
./test

运行结果如图,现在在PC机上是无法运行这个二进制文件的
run0nPC

建立 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
2
3
4
Host pi
Hostname 192.168.123.106
Port 22
User pi

这样就可以通过主机名 pi 来访问到树莓派了,如下

1
ssh pi

运行HelloWorld

把上一步编译出的二进制文件复制到树莓派下

1
scp test pi:/home/pi

在树莓派上运行结果如下:
runOnPi

Makefile 文件编写

通过 Makefile 文件来更方便的进行编译和文件复制,以下是我写的一个简单的 Makefile 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CC=arm-linux-gnueabihf-gcc
CP=scp
OUT_FILE=test
OUT_PATH=pi:/home/pi/source/

all: $(OUT_FILE)

%: %.c
$(CC) -o $@ $^

.PHONY: clean install

clean:
$(RM) $(OUT_FILE)

install:
$(CP) $(OUT_FILE) $(OUT_PATH)

下面是使用过程,还是很方便的
make