2. 开发环境搭建:交叉编译工具链、刷机与系统烧录、SSH远程连接、VSCode远程开发配置

说实话,开发环境搭建这一步,看着琐碎,但恰恰是后面所有工作的地基。我见过太多人模型调得挺好,一到部署就卡在环境上,折腾一两天连板子都跑不起来。咱们这一章就把这些基础活儿捋清楚,一步到位。

2.1 交叉编译工具链:为什么需要它?

你想想看,你的开发电脑是 x86 架构,而边缘设备通常是 ARM 架构。在 x86 上编译出来的程序,ARM 芯片根本读不懂。这时候就需要交叉编译工具链——它运行在你的电脑上,但生成的目标代码是 ARM 格式的。

核心概念:交叉编译 = 在宿主机(x86)上编译出目标机(ARM)可执行的二进制文件。

我个人习惯用 Linaro 提供的 GCC 工具链,稳定且社区活跃。以 Jetson 系列为例,安装步骤大致如下:

# 下载 ARM64 交叉编译工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/

# 配置环境变量
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++

小技巧:把环境变量写到 ~/.bashrc 里,这样每次打开终端就不用重新 export 了。我刚开始总忘,后来干脆写了个脚本一键加载。

2.2 刷机与系统烧录:让板子活起来

拿到一块新板子,第一件事就是给它装上操作系统。不同设备的刷机方式差别挺大,但核心逻辑是一样的:把系统镜像写到板载存储里。

以 NVIDIA Jetson Nano 为例,官方提供了 SDK Manager,图形化操作,比较省心。但如果你用的是香橙派、树莓派这类设备,通常用 dd 命令直接烧录 SD 卡。

# 查看 SD 卡设备号(通常是 /dev/sdb 或 /dev/mmcblk0)
lsblk

# 烧录系统镜像(注意:of= 后面是你的设备号,千万别写错!)
sudo dd if=ubuntu-20.04.6-preinstalled-server-arm64+raspi.img of=/dev/sdb bs=4M status=progress

# 烧录完成后同步并弹出
sync
sudo eject /dev/sdb

我曾经犯过的错:有一次烧录时把 of=/dev/sdb 写成了 of=/dev/sda,直接把电脑硬盘给清了……所以,烧录前一定用 lsblk 再三确认设备号,别手滑。

刷机完成后,插上 SD 卡、接好电源和显示器,第一次启动会进入系统初始化界面。设置好用户名、密码、时区,基本就齐活了。

2.3 SSH 远程连接:告别显示器和键盘

板子跑起来之后,你总不能一直给它连着显示器和键盘吧?SSH 就是你的远程控制神器。

首先,确保板子和你的电脑在同一个局域网内。然后查看板子的 IP 地址:

# 在板子上执行
ip addr show | grep inet

拿到 IP 后,在你的电脑上连接:

ssh username@192.168.1.100

第一次连接会提示确认指纹,输入 yes 就行。之后输入密码,你就进入了板子的终端。

提升效率:配置 SSH 密钥登录,省去每次输密码的麻烦。

# 在电脑上生成密钥(如果还没有的话)
ssh-keygen -t rsa -b 4096

# 将公钥复制到板子上
ssh-copy-id username@192.168.1.100

之后再用 SSH 连接,就不用输密码了。嗯,这一步虽然小,但后面你每天要连几十次,省下的时间可不少。

2.4 VSCode 远程开发配置:像在本地一样写代码

光用终端写代码效率太低了。VSCode 的 Remote - SSH 插件能让你在本地 IDE 里直接编辑板子上的文件、运行终端命令、甚至调试程序。

配置步骤很简单:

  1. 在 VSCode 中安装 Remote - SSH 插件(由 Microsoft 官方出品)。
  2. 按 F1 打开命令面板,输入 Remote-SSH: Connect to Host。
  3. 输入你的 SSH 连接命令,比如 ssh username@192.168.1.100。
  4. 选择配置文件保存位置,VSCode 会自动连接并打开一个新窗口。

连接成功后,左下角会显示 SSH: 192.168.1.100。这时候你打开的文件、运行的终端,都是在板子上执行的。说白了,就是把板子变成了你的远程开发服务器。

我的习惯:我会在板子上创建一个 ~/projects/yolo-deploy 目录,专门存放 YOLO 相关的代码和模型。VSCode 直接打开这个目录,所有操作都在板子上完成,编译、运行、调试一条龙。

2.5 本章知识体系总览

下面这张图把整个开发环境搭建的流程串起来了,你可以对照着检查自己哪一步还没做:

开发环境搭建流程总览 开发环境搭建核心流程 交叉编译工具链 刷机与系统烧录 SSH远程连接 VSCode远程开发 验证环境:跑通Hello World 💡 关键提醒 • 交叉编译工具链版本必须与板子架构匹配(aarch64 vs armv7l) • 烧录时务必确认设备号,避免误伤电脑硬盘

2.6 环境验证:跑通第一个程序

所有环境搭好后,我习惯写一个简单的 Hello World 来验证整个链路是否通畅。

// hello.cpp
#include <iostream>
int main() {
    std::cout << "Hello from Jetson Nano!" << std::endl;
    return 0;
}

在 VSCode 的远程终端里编译并运行:

g++ hello.cpp -o hello
./hello

如果看到输出 Hello from Jetson Nano!,恭喜你,整个开发环境搭建成功了。

更进一步:你可以试试在板子上运行 uname -a,确认架构是 aarch64。再运行 g++ --version,确认编译器版本。这些信息后面排查问题时会用到。

2.7 常见问题速查表

问题现象 可能原因 解决办法
SSH 连接超时 板子 IP 变了或网络不通 检查板子是否开机,用 ping 测试连通性
编译报错:找不到头文件 交叉编译工具链路径未配置 检查 $PATH 是否包含工具链目录
烧录后板子无法启动 镜像损坏或 SD 卡有问题 重新下载镜像,换一张 SD 卡重试
VSCode 远程连接失败 SSH 密钥未配置或权限不对 检查 ~/.ssh/authorized_keys 权限是否为 600

环境搭建这块儿,说白了就是一次配置、长期受益。后面咱们编译 YOLO 的依赖库、跑模型推理,全都依赖这套环境。所以别嫌麻烦,每一步都走扎实了,后面才能顺风顺水。