Linux 交叉编译从原理到完整部署
一、交叉开发概念常规软件开发流程分为三步编写代码 → 编译代码 → 运行调试代码。普通 PC 本地开发以上全部流程可以直接在同一台 x86 架构电脑上完成。嵌入式开发板如 RK3568硬件资源有限仅支持程序运行不具备编译环境无法完成代码编写与编译。因此开发流程必须拆分宿主机x86 架构 PC完成代码编写、代码编译将编译输出的可执行文件传输到开发板目标机ARM 架构开发板执行程序完成运行与调试。这种跨设备、跨 CPU 架构的开发模式称为交叉开发。1.核心原理PC 为 x86 指令集开发板为 ARM 指令集二者指令集互不兼容PC 自带普通 gcc 是本地编译器生成的程序只能在 x86 电脑运行ARM 开发板无法识别必须使用交叉编译器把 C/C 源代码编译成 ARM 架构能够识别的机器指令。2.本地编译与交叉编译对比1. 本地编译PC 程序命令gcc hello.c -o hello输出x86 架构可执行文件仅能在 PC 上运行。2. 交叉编译嵌入式板卡程序命令arm‑linux‑gcc hello.c -o hello输出ARM 架构可执行文件仅能在 RK3568 这类 ARM 开发板上运行。3.使用交叉开发的两点原因嵌入式板卡硬件性能弱一般只具备程序运行环境不适合搭建完整编译环境PC 主机软件资源丰富编译速度快开发调试效率远高于直接在开发板上开发。二、交叉开发的内容1. 开发环境搭建含数据传输环境配置步骤 1确认虚拟机系统位数Ubuntu 虚拟机执行命令uname -a补充说明交叉工具链有 32 位、64 位之分工具链运行在 Ubuntu 系统中系统位数必须与工具链匹配。输出含x86_6464 位系统使用 64 位工具链输出含i68632 位系统使用 32 位工具链。RK3568 配套工具链仅支持 64 位 Ubuntu位数不匹配会出现命令报错、无法运行等问题。步骤 2安装并配置交叉工具链解压工具链之后需要配置 PATH 环境变量。、补充说明交叉编译器存放路径/usr/local/arm‑linux/bin① 不配置环境变量每次编译必须写完整绝对路径/usr/local/arm‑linux/bin/aarch64‑linux‑gnu‑gcc hello.c -o hello路径冗长难记切换目录后会提示命令不存在使用繁琐。② 临时执行环境变量命令仅当前终端有效如果只在当前终端手动输入这条命令export PATH$PATH:/usr/local/arm‑linux/bin当前终端可以正常使用交叉编译器一旦关闭终端、重启虚拟机这条配置直接失效下次开机还要重新输入不适合长期使用。③ 永久配置环境变量两种文件区别清晰需要把语句写入系统配置文件开机自动加载永久生效写入语句统一为export PATH$PATH:/usr/local/arm‑linux/bin1. 修改 ~/.bashrc用户级配置仅当前登录用户生效编辑命令vim ~/.bashrc文件末尾添加环境变量语句生效方式终端执行 source ~/.bashrc不用重启虚拟机适用场景本机只有自己一个开发账号不需要给其他用户使用工具链。2. 修改 /etc/profile系统级全局配置所有用户永久生效课堂教学推荐编辑命令sudo vim /etc/profile文件末尾添加环境变量语句生效方式修改完成后必须重启虚拟机才能完整生效适用场景一台虚拟机多个人共用任意账号登录都能直接调用交叉编译器。步骤 3搭建传输通道建立 PC 与开发板的数据传输通路常用串口、网络 (TFTP)、U 盘三种方式需要安装串口驱动、配置网络服务。2. 编译、调试工具gcc、gdb交叉 gcc完成源代码跨架构编译生成 ARM 架构可执行文件交叉 gdb远程连接开发板实现在线断点调试排查程序问题。3. 库文件处理静态库、动态库PC 自带的.a静态库、.so动态库都是 x86 架构不能直接在 ARM 开发板使用。交叉开发需要编译出 ARM 架构专用库文件编译应用程序时链接对应库保证程序在开发板正常运行。4. 交叉编译与程序运行在宿主机使用交叉编译器编译源码生成 ARM 架构可执行文件通过串口 / 网络 / U 盘把可执行文件传输到开发板在开发板终端给程序添加执行权限chmod x 文件名执行 ./文件名 运行程序。补充说明文件刚传到开发板时默认没有执行权限系统只会把它当作普通文本无法启动。chmod x的作用就是赋予文件可执行权限权限设置完成后才能运行。三、交叉开发工具链交叉编译器1. 工具链定义交叉工具链是一套完整编译工具集合作用是在 x86 宿主机生成 ARM 开发板可用的程序。工具链一般由板卡厂商提供也可以根据硬件自行编译原始编译器长名称aarch64‑linux‑gnu‑gcc适配 RK3568 64 位 ARM 平台。2. 工具链核心组成交叉 gcc/gC、C 语言编译器as 汇编器、ld 链接器处理汇编代码完成代码与库的链接生成可执行程序objcopy将 ELF 格式程序转为 bin/hex 固件用于烧录交叉 gdb远程调试工具ARM 平台对应的头文件、静态库、动态库。3. 工具链完整安装配置流程1. 执行uname -a确认虚拟机位数选用匹配版本工具链2. 将工具链压缩包放到虚拟机共享目录3. 解压工具链到系统目录sudo tar -xvf aarch64‑linux‑gnu‑xxx.tar.xz -C /usr/local/arm‑linux4.修改~/.bashrc或/etc/profile末尾添加环境变量语句export PATH$PATH:/usr/local/arm‑linux/bin修改~/.bashrc执行source ~/.bashrc生效修改/etc/profile重启虚拟机生效。5.输入 aarch64‑linux‑gnu‑gcc -v输出版本信息即代表配置成功。拓展交叉编译命令过长简化方案软链接工具链原始编译器名字很长输入不便可以创建软链接生成简短命令用该方式简化为arm‑linux‑gcc。原理在工具链bin目录创建软链接短命令映射到真实编译器程序配合 PATH 环境变量终端、Makefile 脚本都可以直接使用短命令。操作命令# 进入工具链bin目录cd /usr/local/arm‑linux/bin# 创建软链接sudo ln -s aarch64‑linux‑gnu‑gcc arm‑linux‑gccsudo ln -s aarch64‑linux‑gnu‑g arm‑linux‑g使用效果arm‑linux‑gcc hello.c -o hello