交叉编译应用并上板运行

本篇目标:在你的电脑(x86)上,把一段 C 代码编译成板子(ARM)能直接跑的程序,再传到板子执行。新手做”板子跑我自己程序”的第一步。
板子是 ARM 架构(全志 T153,Cortex-A 系列),不能直接用电脑的 gcc 编出来的程序。


为什么要交叉编译

板子的 CPU 是 ARM,你开发的电脑是 x86。直接在电脑 gcc 编出来的可执行文件是 x86 指令,板子跑不了。需要用交叉编译器(运行在 x86、产出 ARM 指令的编译器)来编。


拿到交叉编译器

两种来源:

  1. 完整编译过 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/
  2. 没编过系统、只拿出厂固件:向厂家索取独立的 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