泰山派RK3566开发板Ubuntu虚拟机交叉编译与运行C/C程序实战最近有不少刚拿到泰山派RK3566开发板的朋友问我怎么在电脑上写程序然后放到板子上跑起来。这其实就是嵌入式Linux开发里最基础也最重要的一步交叉编译。今天我就手把手带大家走一遍这个流程从虚拟机环境搭建到写代码、编译最后传到板子上运行。整个过程我会尽量讲得细一些把容易踩的坑都点出来。咱们的目标很明确在你电脑的Ubuntu虚拟机里写一个简单的“Hello World”程序然后把它编译成能在泰山派ARM64架构上运行的程序最后传到板子上成功执行。1. 准备工作理解交叉编译在开始动手之前咱们先花一分钟搞清楚“交叉编译”是啥。这能帮你理解后面每一步在干什么。你的电脑通常是x86或x64架构的CPU和泰山派开发板用的是ARM架构的RK3566芯片是两种完全不同的“大脑”。用你电脑上的编译器比如gcc生成的可执行文件只能在x86电脑上跑直接丢给ARM板子是跑不起来的就像Windows的.exe文件没法直接在Mac上双击运行一样。所以我们需要一个特殊的编译器它本身运行在你的x86电脑上但它“认识”ARM的指令集能生成ARM板子能执行的程序。这个特殊的编译器就叫交叉编译器。我们这次要用的就是aarch64-linux-gnu-gcc和aarch64-linux-gnu-g。注意交叉编译出来的程序只能在目标架构这里是ARM64的系统上运行。你在编译它的x86虚拟机上是没法直接运行这个a.out的会报格式错误。2. 搭建交叉编译环境好概念清楚了咱们开始动手。首先确保你的虚拟机是Ubuntu 18.04.6 LTS版本。你可以用下面的命令确认一下cat /etc/os-release你应该能看到类似这样的输出关键看VERSION18.04.6 LTS这一行。NAMEUbuntu VERSION18.04.6 LTS (Bionic Beaver) ...2.1 更新软件源并安装工具第一步先更新一下软件包列表确保能安装到最新的软件。sudo apt update更新完成后安装我们需要的三个核心工具交叉编译器C和C以及一个趁手的代码编辑器Vim。sudo apt install gcc-aarch64-linux-gnu g-aarch64-linux-gnu vim这条命令会安装gcc-aarch64-linux-gnu: 用于编译C程序的交叉编译器。g-aarch64-linux-gnu: 用于编译C程序的交叉编译器。vim: 一个在终端里非常强大的文本编辑器。如果你习惯用nano或gedit也可以这里按教程来。2.2 验证安装是否成功安装完成后最好验证一下避免后面步骤出问题。检查C交叉编译器版本aarch64-linux-gnu-gcc --version如果安装成功会输出类似aarch64-linux-gnu-gcc (Ubuntu 9.4.0-1ubuntu1~18.04) 9.4.0的信息。检查C交叉编译器版本aarch64-linux-gnu-g --version检查Vim编辑器版本vim --version看到版本信息就说明环境准备妥当了。3. 编写和编译你的第一个程序环境搭好了现在来写代码。这里要分清楚C程序和C程序因为它们用的编译器不一样。C程序用aarch64-linux-gnu-gcc编译。C程序用aarch64-linux-gnu-g编译。虽然g也能编译纯C代码但它会默认链接C的标准库导致生成的可执行文件体积稍大。对于纯粹的C程序用gcc是更规范的选择。3.1 编写并编译C程序咱们从一个经典的“Hello World”开始。第一步创建C源文件在终端里先进入你打算存放代码的目录比如~/test然后创建一个名为hello.c的文件。touch hello.c第二步用Vim编辑代码用Vim打开这个文件sudo vi hello.c这里用sudo是为了防止权限问题如果你在当前用户目录下操作通常可以不用。打开Vim后界面是“命令模式”不能直接打字。你需要按下键盘上的i键进入“插入模式”。此时屏幕左下角通常会显示-- INSERT --。输入你的C程序代码#include stdio.h int main() { printf(hello world\n); return 0; }代码写完后按ESC键退出“插入模式”回到“命令模式”。输入:wq冒号、w、q然后按回车。这个命令的意思是保存write并退出quit。第三步交叉编译现在用ARM64的交叉编译器来编译这个C文件sudo aarch64-linux-gnu-gcc hello.c如果编译没有错误你会在当前目录下看到一个新生成的文件a.out。这就是编译好的、可以在泰山派上运行的可执行文件。提示a.out是默认的输出文件名。如果你想指定一个更有意义的名字可以使用-o参数例如sudo aarch64-linux-gnu-gcc hello.c -o hello_arm这样生成的可执行文件就叫hello_arm了。3.2 编写并编译C程序流程和C程序几乎一样只是文件后缀和编译器命令不同。第一步创建C源文件touch hello.cpp第二步用Vim编辑代码sudo vi hello.cpp同样按i进入编辑模式输入C代码#include iostream int main() { std::cout hello world std::endl; return 0; }写完按ESC再输入:wq保存退出。第三步交叉编译注意这里必须使用C的交叉编译器gsudo aarch64-linux-gnu-g hello.cpp编译成功后同样会生成默认的a.out文件如果之前有会被覆盖。同样可以用-o参数重命名。4. 在泰山派开发板上运行程序编译好的a.out文件还在你的电脑虚拟机里现在需要把它“搬”到泰山派开发板上运行。第一步传输文件你需要通过某种方式把a.out文件从虚拟机复制到泰山派。最常用的方法有SCP命令推荐如果虚拟机和泰山派在同一个网络。# 在虚拟机终端中执行将文件传到泰山派的家目录 scp ./a.out username泰山派IP地址:~/例如scp ./a.out tspi192.168.1.100:~/共享文件夹如果虚拟机设置了与主机的共享文件夹可以先复制到共享文件夹再从主机通过U盘或网络工具传给泰山派。U盘将文件拷贝到U盘再插入泰山派。第二步在泰山派上运行通过SSH登录到你的泰山派开发板系统是Ubuntu 20.04或者直接在板子的屏幕上打开终端。找到你传过来的a.out文件所在的目录。首先可能需要给它添加可执行权限如果传输后权限丢失chmod x a.out然后运行它./a.out如果一切顺利你将在泰山派的终端上看到输出hello world恭喜这意味着你已经成功完成了从x86虚拟机交叉编译到ARM开发板运行程序的完整流程。这个过程是后续所有更复杂嵌入式Linux应用开发的基础。下次你可以尝试编译更复杂的程序或者学习使用Makefile来管理编译过程效率会更高。