交叉编译--目标平台aarch64 ubuntu 22.04

开发宿主机: ubuntu22.04虚拟机(PC)

目标平台: 地平线x3派/x3 Module , ubuntu22.04, ros2 humble

基于地平线x3开发板 5核 4G的内存的有限的资源,直接在目标机上编译虽然也可以,但耗时太长,而且还需开启swap交换区并关闭并行编译,否则分分钟内存不足。 交叉编译势在必行!!

由于之前交叉编译经验不足,导致各种问题不断,终经九九八十八难脱离苦海,特记录一下,避免重复踩坑

1. 准备目标机的 rootfs

在开发板中安装所有的依赖项, rootfs的导出过程: 【rootfs 的导出过程】

当依赖项增加或变化时, 可通过 scp 命令直接从目标机中复制到开发机器中

建议将 rootfs 放置在宿主机 /opt 目录下

下方为示例:

bash 复制代码
scp -r user@arm64-machine:/lib /path/to/rootfs/lib
scp -r user@arm64-machine:/usr/lib /path/to/rootfs/usr/lib
scp -r user@arm64-machine:/usr/include /path/to/rootfs/usr/include

2. 安装配置交叉编译链

起初选择官方提供的交叉编译工具链

bash 复制代码
curl -fO https://archive.d-robotics.cc/toolchain/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu.tar.xz

但官方提供的gcc版本与目标机 的不一致,导致编译时连接错误。

自己制作交叉编译链工具比较繁琐,我这里就偷懒就直接使用apt 安装了,目标机和宿主机都是ubuntu22.04

也可自己制作工具链, 参考 蓝易云 - Ubuntu22.04交叉编译gcc9.5 for arm_ubuntu_百度搜索:蓝易云_InfoQ写作社区

将gcc 版本替换为 gcc11 或更高版本

bash 复制代码
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

3. 创建工具链配置文件

创建交叉编译工具链配置文件,设置CMake 编译属性

在开发目录下创建配置 文件 toolchain-aarch64.cmake 内容如下:

bash 复制代码
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# 设置交叉编译器
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)

# 设置sysroot为从目标系统拷贝出来的rootfs路径
set(CMAKE_SYSROOT /opt/sunrise_fs/rootfs)

# 添加include路径(用于头文件搜索)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/local/include")
# 或者可以使用CMAKE_INCLUDE_PATH指定头文件搜索路径
set(CMAKE_INCLUDE_PATH "${CMAKE_SYSROOT}/usr/local/include")

# 添加库路径(用于库搜索)
set(CMAKE_LIBRARY_PATH "${CMAKE_SYSROOT}/usr/local/lib")

# 设置find路径
set(CMAKE_FIND_ROOT_PATH /opt/sunrise_fs/rootfs)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

4. 创建编译脚本,执行环境配置和编译过程

创建shell 脚本执行编译过程 cross_build.sh

bash 复制代码
#!/bin/bash
###
 # @Author: zhangshouyang 522718597@qq.com
 # @Date: 2024-02-23 09:44:35
 # @Description: 
### 


# 设置交叉编译工具链的路径
# 使用系统中安装的gcc-aarch64-linux-gnu和g++-aarch64-linux-gnu
export CC=/usr/bin/aarch64-linux-gnu-gcc
export CXX=/usr/bin/aarch64-linux-gnu-g++
export LD=/usr/bin/aarch64-linux-gnu-ld

# 设置从目标机中拷贝出来的rootfs路径
export SYSROOT=/opt/sunrise_fs/rootfs  # 替换为你的rootfs实际路径
export ROS2_WS=/home/Develop/AutomaticSystem    # 替换为ROS 2功能包工作区路径
TOOLCHAIN_FILE_PATH=/home/Develop/toolchain-aarch64.cmake # 替换为实际路径

# 切换到ROS2工作区
cd $ROS2_WS

# 清理上一次的构建
echo "Cleaning previous build..."

# rm -rf build/ install/ log/

# 交叉编译命令
colcon build --merge-install \
  --parallel-workers 8 \
  --cmake-force-configure \
  --cmake-args \
  -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE_PATH" \
  -DCMAKE_SYSROOT=${SYSROOT} \
  -DCMAKE_FIND_ROOT_PATH=${SYSROOT} \
  -DCMAKE_VERBOSE_MAKEFILE=ON \
  -DBUILD_SHARED_LIBS=ON
  # -DTHIRDPARTY=ON
相关推荐
EMTime19 小时前
Docker运行OpenWRT
运维·docker·容器
lolo大魔王20 小时前
Linux 文件系统超全面详解(原理、结构、挂载、分区、inode、日志、管理命令)
linux·运维·服务器
磊 子21 小时前
详细讲解一下epoll
linux·io·epoll·io多路复用
printfLILEI1 天前
php中的类与对象以及反序列化
linux·开发语言·php
zyl837211 天前
Docker 使用手册
运维·docker·容器
古月方枘Fry1 天前
MGRE实验
运维·服务器
叠叠乐1 天前
redmi k90 pro max 强解BL,刷海外rom, 并刷入sukisu ultra
linux
stolentime1 天前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
feasibility.1 天前
ROS2+Gazebo+VLM服务:纯仿真环境下的具身智能闭环系统| 大脑-小脑分离控制
人工智能·机器人·ros·仿真·具身智能·vla·vlm
xiaoye-duck1 天前
《Linux系统编程》Linux 进程间通信之管道基础解析:从匿名管道原理到基于管道的进程池实现
linux