3. 开发环境搭建:交叉编译工具链安装、SSH远程开发配置、文件传输与同步(rsync)
说实话,嵌入式开发最让人头疼的,就是环境搭建这一步。
我见过太多新手,买了开发板,兴致勃勃地准备大干一场,结果卡在装工具链上,一卡就是两三天。嗯,我自己当年也踩过不少坑。今天咱们就把这块硬骨头啃下来。
3.1 交叉编译工具链:为什么需要它?
先想一个问题:你的电脑是 x86 架构,而开发板通常是 ARM 架构。你在电脑上编译出来的程序,开发板能直接跑吗?
答案是不能。指令集都不一样,跑起来才怪。
所以我们需要交叉编译工具链。说白了,就是一套能在你的电脑上运行,但能生成 ARM 可执行文件的编译器、链接器、调试器等等。
核心概念:交叉编译 = 在宿主机(x86)上编译,生成目标机(ARM)上运行的代码。
3.2 安装交叉编译工具链
我个人习惯用 Linaro 提供的工具链,稳定、社区活跃。当然,如果你用的是某家芯片厂商的 SDK,他们通常会提供定制版。
3.2.1 下载与解压
# 以 gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf 为例
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
# 解压到 /opt 目录
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/
小技巧:我建议把工具链放在 /opt 下,而不是 /usr/local。这样方便管理多个版本,切换起来也干净。
3.2.2 配置环境变量
解压完只是第一步,你得让系统知道去哪找这些工具。
# 编辑 ~/.bashrc 或 ~/.zshrc
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
# 使配置生效
source ~/.bashrc
# 验证安装
arm-linux-gnueabihf-gcc --version
看到版本号输出,就说明装好了。
注意:我曾经遇到过 PATH 写错导致系统命令都找不到的情况。建议先备份 .bashrc,或者用绝对路径测试一下再写入。
3.2.3 测试编译
写个简单的 hello.c,试试能不能编译出 ARM 的可执行文件。
// hello.c
#include <stdio.h>
int main() {
printf("Hello, Embedded World!\n");
return 0;
}
arm-linux-gnueabihf-gcc hello.c -o hello_arm
# 查看文件信息
file hello_arm
# 输出: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked...
看到 ARM 字样,就对了。
3.3 SSH 远程开发配置
开发板通常没有显示器、键盘。你总不能每次都插个 HDMI 和 USB 键盘吧?
SSH 就是你的远程操作利器。我习惯用 SSH 连上开发板,就像操作一台远程服务器一样。
3.3.1 开发板端开启 SSH 服务
大多数 Linux 开发板默认就开了 SSH。如果没有,手动启动一下:
# 检查 SSH 服务状态
systemctl status sshd
# 如果没启动
sudo systemctl start sshd
sudo systemctl enable sshd # 设置开机自启
3.3.2 宿主机连接开发板
# 假设开发板 IP 是 192.168.1.100,用户名是 root
ssh root@192.168.1.100
第一次连接会提示确认指纹,输入 yes 就行。
避坑指南:我曾经因为开发板和电脑不在同一个网段,折腾了半天。最简单的办法:用网线直连,或者把开发板接到和电脑同一个路由器下。
3.3.3 配置免密登录(强烈推荐)
每次输密码太烦了。配置 SSH 密钥,一劳永逸。
# 在宿主机生成密钥对(如果已有则跳过)
ssh-keygen -t rsa -b 4096
# 将公钥复制到开发板
ssh-copy-id root@192.168.1.100
# 测试免密登录
ssh root@192.168.1.100
嗯,从此告别密码。
3.4 文件传输与同步:rsync 实战
开发过程中,你需要频繁地把编译好的程序传到开发板上。用 U 盘拷?太原始了。用 scp?可以,但每次全量传输,效率低。
我强烈推荐 rsync。它只传输差异部分,速度飞快。
3.4.1 rsync 基本用法
# 将本地 build/ 目录同步到开发板的 /root/app/ 目录
rsync -avz --progress ./build/ root@192.168.1.100:/root/app/
参数说明:
-a:归档模式,保留权限、时间戳等-v:显示详细信息-z:传输时压缩,节省带宽--progress:显示进度
3.4.2 增量同步实战
假设你只修改了一个源文件,重新编译后,只需要把新的可执行文件传过去。
# 第一次同步(全量)
rsync -avz ./build/ root@192.168.1.100:/root/app/
# 修改代码后,再次同步(增量,只传变化的部分)
rsync -avz --delete ./build/ root@192.168.1.100:/root/app/
--delete 参数很实用:它会删除开发板上那些本地已经不存在的文件,保持两边完全一致。
注意:使用 --delete 要小心。我曾经手滑写反了源和目标路径,结果把本地文件删了个精光。建议先加 --dry-run 参数模拟运行,确认无误后再执行。
3.4.3 自动化同步脚本
每次敲一长串命令也麻烦。我习惯写个脚本:
#!/bin/bash
# sync_to_board.sh
TARGET="root@192.168.1.100:/root/app/"
SOURCE="./build/"
echo "Syncing to board..."
rsync -avz --delete --progress $SOURCE $TARGET
echo "Done!"
以后只需要 ./sync_to_board.sh 就行了。
3.5 本章知识体系
下面这张图,帮你理清整个开发环境搭建的逻辑:
3.6 常见问题与解决
| 问题 | 原因 | 解决方法 |
|---|---|---|
| arm-linux-gnueabihf-gcc: command not found | PATH 没配置对 | 检查 PATH 是否包含工具链的 bin 目录 |
| SSH 连接超时 | 网络不通或 SSH 服务没启动 | 先 ping 开发板,再检查 sshd 状态 |
| rsync 传输慢 | 没有使用压缩参数 | 加上 -z 参数启用压缩 |
| 编译出来的程序在开发板上运行报错 | 工具链版本与开发板不匹配 | 确认开发板的 glibc 版本,选择对应的工具链 |
总结一下:环境搭建其实就三件事——装好工具链、配好 SSH、用好 rsync。这三板斧抡熟了,后面的开发就顺畅多了。
公众号:蓝海资料掘金营,微信deep3321