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
技术解析:
binfmt_misc
是Linux内核功能,允许注册二进制格式解释器- QEMU作为"桥梁"解释执行ARM指令
- 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进行神经网络加速,这些变量确保:
- 正确找到NVIDIA驱动和库文件
- 设置GPU访问权限
- 指定版本兼容性
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
四、技术难点解析
-
指令集转换:QEMU动态转换ARM指令为x86指令,性能损耗约4-5倍
-
库依赖冲突:
- 使用Docker隔离环境
- 显式指定库版本
-
GPU穿透:
-
交叉编译陷阱:
- 文件路径大小写敏感
- 依赖库的架构匹配
- 环境变量污染
五、验证与部署
编译成功后,在容器内检查产物:
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架构在边缘计算领域的普及,掌握这项技术将极大提升开发效率。