交叉编译应用并上板运行
本篇目标:在你的电脑(x86)上,把一段 C 代码编译成板子(ARM)能直接跑的程序,再传到板子执行。新手做”板子跑我自己程序”的第一步。
板子是 ARM 架构(全志 T153,Cortex-A 系列),不能直接用电脑的gcc编出来的程序。
为什么要交叉编译
板子的 CPU 是 ARM,你开发的电脑是 x86。直接在电脑 gcc 编出来的可执行文件是 x86 指令,板子跑不了。需要用交叉编译器(运行在 x86、产出 ARM 指令的编译器)来编。
拿到交叉编译器
两种来源:
- 完整编译过 SDK 后,工具链会在 SDK 输出目录里生成,常见前缀如
arm-linux-gnueabihf-gcc或 SDK 提供的arm-openwrt-linux-gcc。典型位置(以 SDK 实际为准):- Buildroot 工具链:
out/t153_nand_base/.../host/bin/arm-buildroot-linux-gnueabihf-gcc - 或 Tina 预置工具链目录
prebuilt/.../bin/
- Buildroot 工具链:
- 没编过系统、只拿出厂固件:向厂家索取独立的 ARM 交叉编译工具链(含
*-gcc的压缩包),解压后把bin/加进PATH。
具体前缀/路径以厂家提供的工具链包为准,本文用
${CROSS}gcc表示你的交叉编译器前缀。
写个例子
hello.c:
#include <stdio.h>
int main() {
printf("Hello YPT153EVB!\n");
return 0;
}用交叉编译器编译
# 假设交叉编译器前缀是 arm-linux-gnueabihf-
$ arm-linux-gnueabihf-gcc hello.c -o hello如果工具链没加进 PATH,用绝对路径:
$ /path/to/toolchain/bin/arm-linux-gnueabihf-gcc hello.c -o hello确认编出来的是 ARM 程序
$ file hello
hello: ELF 32-bit LSB executable, ARM, ... # 看到 ARM 就对了如果是 x86-64 说明用错编译器(用了本机 gcc)。
传到板子并运行
# 电脑上,用《网络配置与文件传输》的 scp
$ scp hello root@192.168.1.123:/root/
# 板子上
root@YPT153EVB:~# chmod +x hello
root@YPT153EVB:~# ./hello
Hello YPT153EVB!链接库的注意点
- 如果你的程序用了第三方库(如 OpenCV、sqlite),要在交叉编译时指向 ARM 版的库(头文件 +
.so),否则编出的程序板子上跑会报”找不到库”。 - 简单场景尽量静态链接避免依赖:
arm-linux-gnueabihf-gcc hello.c -static -o hello。 - 板子根文件系统已带常用基础库(glibc/musl 视 SDK 而定)。
排障
| 现象 | 处理 |
|---|---|
板子跑报 cannot execute / Exec format error |
编出来是 x86;确认用的是交叉编译器 |
file 显示 x86 |
用错 gcc;检查 PATH 与命令前缀 |
运行报 not found(库缺) |
动态库缺失;静态链接或带上 ARM 库 |
| 编译器找不到 | 工具链没装/没加 PATH;用绝对路径或重设 PATH |
作者:Mai 创建时间:2026-10-20 16:43
最后编辑:Mai 更新时间:2026-11-05 14:56
最后编辑:Mai 更新时间:2026-11-05 14:56