当前位置: 首页 > news >正文

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

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

  • x86-64安装编译Apollo 9.0 aarch64版本
    • 一、背景与挑战
    • 二、环境配置
    • 三、详细操作步骤
      • 3.1 配置Docker支持多架构
        • 配置ARM模拟环境
      • 3.2 编译Apollo 9.0
        • 3.2.1 获取源代码
        • 3.2.2 准备编译环境
        • 3.2.3 修复源码问题
        • 3.2.4 执行编译
    • 四、技术难点解析
    • 五、验证与部署
    • 六、总结

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架构在边缘计算领域的普及,掌握这项技术将极大提升开发效率。

http://www.lqws.cn/news/513613.html

相关文章:

  • ZArchiver×亚矩云手机:云端文件管理的“超维解压”革命
  • B树和B+树的区别
  • SpringBoot项目快速开发框架JeecgBoot——数据访问!
  • 从零开始的云计算生活——第二十三天,稍作休息,Tomcat
  • pycharm基础操作备忘记录
  • 国芯思辰|同步降压转换器CN2020A替换LMR33620应用于分布式电源系统
  • Jenkins X + AI:重塑云原生时代的持续交付范式
  • Docker部署Flask应用
  • Android14音频子系统-Linux音频子系统ALSA
  • 微信小程序 / UNIAPP --- 阻止小程序返回(顶部导航栏返回、左 / 右滑手势、安卓物理返回键和调用 navigateBack 接口)
  • 服务器性能优化通用方案
  • 文档处理控件Aspose.Words教程:在.NET中将多页文档转换为单个图像
  • 【开源解析】基于PyQt5的智能费用报销管理系统开发全解:附完整源码
  • Golang单例实现
  • LVS-NAT负载均衡群集实战:原理、部署与问题排查
  • 小程序快速获取url link方法,短信里面快速打开链接
  • Spark Streaming 与 Flink 实时数据处理方案对比与选型指南
  • Flink2.0 配置 historyserver
  • 15个AI模拟面试平台 和 简历修改 / 真人面试平台
  • 云计算产业链
  • 用wordpress建日语外贸网站的优势
  • C# Avalonia 绑定模式 Mode 的区别,它们的应用场景
  • spring中的@Cacheable缓存
  • MicroPython网络编程:AP模式与STA模式详解
  • 【笔记——李沐动手学深度学习】2.3 线性代数
  • 【Python练习】012. 使用字符串的upper()方法将字符串转换为大写
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的美食菜单社交化营销创新研究
  • 音频转换芯片DP7344兼容CS4344双通道24位DA转换器技术资料
  • 宠物养成小游戏流量主微信小程序开源
  • 小米互联应用曝高危漏洞,攻击者可绕过认证获取设备完全控制权