x86-64安装编译Apollo 9.0 aarch64版本

x86-64安装编译Apollo 9.0 aarch64版本

一、背景与挑战

在现代自动驾驶系统中,Apollo平台作为开源标杆项目,其9.0版本引入了众多创新功能。然而,许多车载计算平台采用ARM架构(aarch64),而开发者通常使用x86-64架构的PC进行开发,这就产生了跨架构编译的需求。

本文将详细指导如何在x86-64主机上编译Apollo 9.0的aarch64版本,并解释每个步骤背后的技术原理,帮助普通开发者理解这一复杂过程。

二、环境配置

  • 操作系统:Ubuntu 20.04/22.04
  • 核心工具:Docker + QEMU

为什么需要这些工具?
Docker提供隔离的编译环境,QEMU实现指令集模拟,两者结合解决了x86-64和ARM架构间的兼容性问题。

三、详细操作步骤

3.1 配置Docker支持多架构

cat > /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors" : [
        "https://docker.registry.cyou",
        "https://docker-cf.registry.cyou",
        "https://dockercf.jsdelivr.fyi",
        "https://docker.jsdelivr.fyi",
        "https://dockertest.jsdelivr.fyi",
        "https://mirror.aliyuncs.com",
        "https://dockerproxy.com",
        "https://mirror.baidubce.com",
        "https://docker.m.daocloud.io",
        "https://docker.nju.edu.cn",
        "https://docker.mirrors.sjtug.sjtu.edu.cn",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirror.iscas.ac.cn",
        "https://docker.rainbond.cc",
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://dockerproxy.com",
        "https://gst6rzl9.mirror.aliyuncs.com",
        "https://registry.docker-cn.com",
        "http://hub-mirror.c.163.com",
        "http://mirrors.ustc.edu.cn/",
        "https://mirrors.tuna.tsinghua.edu.cn/",
        "http://mirrors.sohu.com/" 
    ],
    "insecure-registries" : [
        "registry.docker-cn.com",
        "docker.mirrors.ustc.edu.cn"
    ],
    "debug": true,
    "experimental": true
}
EOF

# 重启Docker服务
systemctl daemon-reload
systemctl restart docker
docker info # 验证配置生效
配置ARM模拟环境
sudo modprobe binfmt_misc
ls /proc/sys/fs/binfmt_misc/  # 确认目录存在

# 安装QEMU模拟器
sudo apt update 
sudo apt install qemu-user-static binfmt-support -y

# 下载并配置aarch64模拟器
wget https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-aarch64-static.tar.gz
tar -xf qemu-aarch64-static.tar.gz
cp qemu-aarch64-static /usr/bin/

# 手动注册 aarch64 模拟器
sudo update-binfmts --install aarch64 /usr/bin/qemu-aarch64-static \
    --magic '\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00' \
    --mask '\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
sudo service binfmt-support restart

# 全局注册QEMU解释器
docker run --rm --privileged multiarch/qemu-user-static:register --reset

技术解析

  1. binfmt_misc是Linux内核功能,允许注册二进制格式解释器
  2. QEMU作为"桥梁"解释执行ARM指令
  3. Docker通过--privileged获取系统权限注册模拟器

3.2 编译Apollo 9.0

3.2.1 获取源代码
git clone https://github.com/ApolloAuto/apollo.git apollo9.0
cd apollo9.0
git checkout v9.0.0-rc-r10 # 切换到9.0版本
3.2.2 准备编译环境
# 进入工程目录
cd /home/apollo9.0

# 启动专为aarch64设计的Docker容器
bash docker/scripts/dev_start.sh  -c aarch64

# 进入容器环境
bash docker/scripts/dev_into.sh

# 安装依赖
apt update
apt-get install --reinstall python3-openssl python3-cryptography
apt install libpcl-dev -y # 点云库支持

环境变量配置

# 标识交叉编译环境
touch /.cross-platform

# 配置CUDA相关路径(GPU加速必需)
export PATH=/opt/apollo/sysroot/bin:$PATH
export USE_NVIDIA_GPU=1
export CUDA_LITE=11.4
export CUDA_VERSION=11.4.1
export PATH=/usr/local/cuda/bin:${PATH}
export NVIDIA_VISIBLE_DEVICES=all
export NVIDIA_DRIVER_CAPABILITIES=compute,utility
export NVIDIA_REQUIRE_CUDA="cuda>=${CUDA_LITE}"
export LIBRARY_PATH=/usr/local/cuda/lib64/stubs
export CUDNN_VERSION=8.6.0.1665
export TENSORRT_VERSION=8.5.2

为什么需要这些环境变量?
Apollo依赖CUDA进行神经网络加速,这些变量确保:

  1. 正确找到NVIDIA驱动和库文件
  2. 设置GPU访问权限
  3. 指定版本兼容性
3.2.3 修复源码问题

问题1:PCL库检测逻辑缺陷
修改文件:third_party/pcl/pcl_configure.bzl

# 原始问题:检测逻辑可能匹配多个结果
cmd = """ldconfig -p | awk -F'=>' '/libpcl_common.so$/ {print $2}'"""

# 修复后:精确获取最后一个匹配项
cmd = """ldconfig -p | awk -F'=>' '/libpcl_common.so$/ {print $2}' | tail -n 1"""

问题2:GPU平台识别失败
修改文件:scripts/apollo.bashrc

# 强制指定GPU平台为NVIDIA
export GPU_PLATFORM="NVIDIA"

为什么需要这些修改?
交叉编译环境中自动检测机制常失效,明确指定可避免构建失败。

3.2.4 执行编译
# 清理历史构建
./apollo.sh clean -a

# 开始GPU加速编译
./apollo.sh build_gpu

如何提示超时,如下设置代理

export proxy="http://192.168.1.100:8080"
export http_proxy=$proxy
export https_proxy=$proxy

四、技术难点解析

  1. 指令集转换:QEMU动态转换ARM指令为x86指令,性能损耗约4-5倍

  2. 库依赖冲突

    • 使用Docker隔离环境
    • 显式指定库版本
  3. GPU穿透

    Host GPU
    Docker容器
    QEMU模拟器
    ARM二进制
  4. 交叉编译陷阱

    • 文件路径大小写敏感
    • 依赖库的架构匹配
    • 环境变量污染

五、验证与部署

编译成功后,在容器内检查产物:

file bazel-bin/modules/perception/onboard/component/libperception_component_camera.so

# 期望输出:ELF 64-bit LSB shared object, ARM aarch64

将编译产物复制到ARM设备即可运行,无需重新编译。

六、总结

通过Docker+QEMU的方案,我们实现了:

  • ✅ 在x86平台构建ARM应用
  • ✅ 复用现有开发环境
  • ✅ 避免复杂的交叉编译工具链配置

此方案不仅适用于Apollo,也可推广到其他复杂项目的跨架构构建场景。随着ARM架构在边缘计算领域的普及,掌握这项技术将极大提升开发效率。

Apollo 9.0是一个自动驾驶开发平台,它提供了一套完整的软硬件解决方案,用于开发和部署自动驾驶系统。交叉编译是在一种平台上生成在另一种平台上运行的可执行文件的过程。在Apollo 9.0中,交叉编译通常用于将代码从开发主机编译为目标平台上的可执行文件。 要进行Apollo 9.0的交叉编译,您需要按照以下步骤进行操作: 1. 配置交叉编译环境:首先,您需要安装目标平台的交叉编译工具链。这些工具链包括交叉编译器、链接器和库文件。您可以从目标平台的官方网站或开发者社区获取这些工具链。 2. 设置环境变量:将交叉编译工具链的路径添加到系统的环境变量中,以便在编译过程中能够正确地找到这些工具。 3. 配置构建系统:Apollo 9.0使用Bazel作为构建系统。您需要根据目标平台的要求,配置Bazel的构建规则和选项。这包括指定目标平台的架构、操作系统和其他相关参数。 4. 编译代码:使用Bazel命令行工具执行编译命令,将代码编译为目标平台上的可执行文件。根据您的需求,您可以选择编译整个Apollo 9.0系统,或者只编译特定的模块或组件。 5. 部署和测试:将编译生成的可执行文件部署到目标平台上,并进行测试和验证。确保代码在目标平台上能够正常运行,并满足性能和功能要求。 请注意,具体的交叉编译步骤可能因为您使用的目标平台和开发环境而有所不同。建议您参考Apollo 9.0的官方文档和开发者社区,以获取更详细和准确的交叉编译指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hi20240217

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值