使用Docker配置适配泰山派的交叉编译环境

编写交叉编译环境的 Dockerfile

基于一个干净的 Ubuntu 镜像,手动安装所需的工具链。在项目目录下,创建一个Dockerfile文件。

dockerfile 复制代码
# 使用一个稳定、干净的 Ubuntu 22.04 作为基础镜像
FROM ubuntu:22.04

# 设置环境变量,避免 apt-get 在安装时弹出交互式配置界面
ENV DEBIAN_FRONTEND=noninteractive

# 更新包列表并安装交叉编译工具链及常用开发工具
# RUN 指令合并为一条,以减少镜像层数,这是最佳实践
RUN apt-get update && \
    apt-get install -y \
    # 核心的交叉编译工具链
    gcc-aarch64-linux-gnu \
    g++-aarch64-linux-gnu \
    # 常用构建工具
    make \
    cmake \
    # 模拟器:用于在 x86 主机上直接运行 aarch64 程序进行快速测试
    qemu-user-static \
    # 文件工具:用于查看文件类型
    file \
    # 清理 apt 缓存以减小镜像体积
    && rm -rf /var/lib/apt/lists/*

# 设置容器内的工作目录
WORKDIR /workspace

# 设置 QEMU 的库查找路径,这样就可以直接运行 ARM64 程序
ENV QEMU_LD_PREFIX=/usr/aarch64-linux-gnu/

# 默认启动一个 bash shell
CMD ["/bin/bash"]

特殊说明:

  • gcc-aarch64-linux-gnu: Ubuntu 官方源里就提供了现成的交叉编译工具链,安装非常方便。
  • gdb-multiarch: 普通的 gdb 只能调试本机架构的程序。gdb-multiarch 是一个"万能"调试器,可以调试 ARM、MIPS 等多种架构的程序。
  • qemu-user-static: 它是一个用户态模拟器,可以实现在 x86 电脑上直接运行 ARM 程序,无需每次都传到泰山派上测试。

构建与运行交叉编译环境

  1. 构建镜像 :
    在 Dockerfile 所在的目录,执行:
bash 复制代码
# -f 指定 Dockerfile 文件
# -t 给镜像打一个清晰的标签
sudo docker build -f Dockerfile -t aarch64-dev-env .
  1. 启动开发容器 :
    使用卷挂载来同步代码。
bash 复制代码
# 假设项目代码在 ~/my_arm_project
cd ~/my_arm_project
sudo docker run -it --rm -v $(pwd):/workspace aarch64-dev-env

交叉编译与测试

  1. 验证工具链 :
    在容器内,执行以下命令,确认工具链已安装并可用。
bash 复制代码
# 在容器内执行,可以看见版本信息
aarch64-linux-gnu-gcc --version
  1. 编写一个简单的 C 程序 :
    在宿主机的 ~/my_arm_project 目录下,创建一个 hello.c 文件。
c 复制代码
#include <stdio.h>
int main() {
    printf("Hello, TaiShan-Pi (RK3566)!\n");
    #ifdef __aarch64__
        printf("I was compiled for ARM64.\n");
    #else
        printf("I was NOT compiled for ARM64.\n");
    #endif
    return 0;
}
  1. 进行交叉编译 :
    在容器内,执行交叉编译命令。
bash 复制代码
# 在容器内执行
aarch64-linux-gnu-gcc -o hello hello.c
  1. 验证生成的可执行文件 :
    使用 file 命令查看文件类型。
bash 复制代码
# 在容器内执行
file hello

输出应该类似这样,明确指出是 aarch64 架构:

bash 复制代码
hello: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, ..., not stripped
  1. 在 x86 主机上运行 ARM 程序
    qemu-user-static 的作用:
bash 复制代码
# 在容器内执行
./hello_arm

输出:

bash 复制代码
Hello, TaiShan-Pi (RK3566)!
I was compiled for ARM64.
相关推荐
Lvan的前端笔记26 分钟前
docker:每个前端项目一个 Nginx 容器还是只有一个Nginx容器
前端·nginx·docker
Apipi*1 小时前
30天速通Linux 第六章信号及信号处理
linux·运维·信号处理
天启HTTP2 小时前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
广州浮点FLOATLIC4 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
BLUcoding5 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK5 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2085 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)5 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter6255 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
sbjdhjd6 小时前
云安全 | Docker 容器逃逸复盘(三):docker.sock 挂载与 Docker-in-Docker 风险
经验分享·网络安全·docker·云原生·容器·kubernetes·云安全