ROS2 humble交叉编译环境配置

目录

直接上干货,本文将介绍配置ROS2的交叉编译环境

  • 编译平台:x86 ubuntu 22.04
  • 目标平台:arm v8 ubuntu 22.04
  • ROS2版本:ROS2 humble

配置

toolchain文件:

bash 复制代码
#File rostoolchain.cmake
INCLUDE(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)

set(CMAKE_SYSROOT /cross_compile)
set(CMAKE_FIND_ROOT_PATH /cross_compile/ros/humble /cross_compile/usr /code)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

库文件

复制arm环境下的以下文件到交叉编译环境下:

bash 复制代码
/usr/lib      -->   /cross_compile/user/lib
/usr/include  -->   /cross_compile/user/include
/usr/bin      -->   /cross_compile/user/bin
/usr/local    -->   /cross_compile/user/local
/usr/share    -->   /cross_compile/user/share

需要注意的是,复制完成之后,检查一下 /usr/lib/aarch64-linux-gnu 目录下,发现有些软链接报错,这些错误是特定库的软链接,主要链接到 /etc/alternatives/ 目录下的一些文件,我们根据 arm 环境下的链接重新建立软链接即可

交叉编译指令:

bash 复制代码
colcon build --merge-install --cmake-force-configure --cmake-args -DCMAKE_TOOLCHAIN_FILE=/compile_toolchain.cmake

问题点:

1、find_package找不到自定义依赖包的问题

问题描述:

第三方依赖可以找到,但是找不到代码目录下的自定义依赖包

如:/code/ros2_demo 目录下有两个包:common_msgs 和 test_topic,test_topic 包依赖 common_msgs

交叉编译链的cmake配置文件如下:

cmake 复制代码
#File rostoolchain.cmake
INCLUDE(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)

set(CMAKE_SYSROOT /cross_compile/usr)
set(CMAKE_FIND_ROOT_PATH /opt/ros/humble /cross_compile/usr /code)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

能保证代码没有问题,在非交叉编译环境没有问题,交叉编译环境下,编译 test_topic 报错,find_package(common_msgs) 找不到包,但是第三方包却能找到

原因:

这里有个现场,find_package() 能找到第三方包,但是找不到自定义包

问题出在 CMAKE_FIND_ROOT_PATH_MODE_PACKAGE 上,这里指定了 CMAKE_FIND_ROOT_PATH 值,且 CMAKE_FIND_ROOT_PATH_MODE_PACKAGE 设置为ONLY,即只找 CMAKE_FIND_ROOT_PATH 路径下的包,而用户代码不在 CMAKE_FIND_ROOT_PATH 路径下,就导致 find_package() 能找到第三方包,却找不到用户自定义包

解决方法:

两种解决方法:

  1. CMAKE_FIND_ROOT_PATH_MODE_PACKAGE 设置为 BOTH,但这是交叉编译环境,这样设置会导致后续找包都会去系统目录下,可能会有问题;
  2. CMAKE_FIND_ROOT_PATH 中添加用户代码目录;

2、libarmadillo.so.10: undefined reference to `xxx'

个别so找不到链接

原因:

有些so软链接没有配置正确,容易忽略的是 /etc/alternatives 目录下的,libblas.so.3-aarch64-linux-gnu 和 liblapack.so.3-aarch64-linux-gnu

3、/usr/bin/moc找不到

ROS 有些模块依赖qt5,但是从arm复制过去的二进制文件是不能用的,且路径也不一样,交叉编译环境安装qt5-default即可

bash 复制代码
apt install qt5-default

从ubuntu22开始,qt5-default从源中被删掉了,可以用替换指令

bash 复制代码
apt install qtbase5-dev
相关推荐
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境2 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境2 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴3 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境5 天前
C++ 的Eigen 库全解析
c++
卷无止境5 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴5 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18007 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴7 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake