网站域名不备案,域名服务器ip查询网站,乐清做手机网站,湛江建设工程信息网开发宿主机#xff1a; ubuntu22.04虚拟机#xff08;PC#xff09;
目标平台#xff1a; 地平线x3派/x3 Module , ubuntu22.04#xff0c; ros2 humble
基于地平线x3开发板 5核 4G的内存的有限的资源#xff0c;直接在目标机上编译虽然也可以#xff0c;但耗时太长 ubuntu22.04虚拟机PC
目标平台 地平线x3派/x3 Module , ubuntu22.04 ros2 humble
基于地平线x3开发板 5核 4G的内存的有限的资源直接在目标机上编译虽然也可以但耗时太长而且还需开启swap交换区并关闭并行编译否则分分钟内存不足。 交叉编译势在必行 由于之前交叉编译经验不足导致各种问题不断终经九九八十八难脱离苦海特记录一下避免重复踩坑 1. 准备目标机的 rootfs
在开发板中安装所有的依赖项 rootfs的导出过程 【rootfs 的导出过程】
当依赖项增加或变化时 可通过 scp 命令直接从目标机中复制到开发机器中
建议将 rootfs 放置在宿主机 /opt 目录下
下方为示例:
scp -r userarm64-machine:/lib /path/to/rootfs/lib
scp -r userarm64-machine:/usr/lib /path/to/rootfs/usr/lib
scp -r userarm64-machine:/usr/include /path/to/rootfs/usr/include 2. 安装配置交叉编译链
起初选择官方提供的交叉编译工具链
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 或更高版本
sudo apt install gcc-aarch64-linux-gnu g-aarch64-linux-gnu3. 创建工具链配置文件
创建交叉编译工具链配置文件设置CMake 编译属性
在开发目录下创建配置 文件 toolchain-aarch64.cmake 内容如下
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
#!/bin/bash
#### Author: zhangshouyang 522718597qq.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_MAKEFILEON \-DBUILD_SHARED_LIBSON# -DTHIRDPARTYON