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
相关推荐
满天星830357718 小时前
【C++】特殊类设计
c++·windows
大聪明-PLUS19 小时前
一个简单高效的 C++ 监控程序,带有一个通用的 Makefile
linux·嵌入式·arm·smarc
Ljubim.te19 小时前
inline介绍,宏定义的注意事项以及nullptr
c语言·开发语言·c++
苦藤新鸡19 小时前
6.三数之和
c语言·c++·算法·力扣
Frank_refuel19 小时前
C++之内存管理
java·数据结构·c++
leiming619 小时前
c++ qt开发第一天 hello world
开发语言·c++·qt
@小码农20 小时前
6547网:202512 GESP认证 C++编程 一级真题题库(附答案)
java·c++·算法
TDengine (老段)20 小时前
TDengine C/C++ 连接器入门指南
大数据·c语言·数据库·c++·物联网·时序数据库·tdengine
vyuvyucd20 小时前
C++ vector容器完全指南
c++
liulilittle20 小时前
XDP VNP虚拟以太网关(章节:三)
网络·c++·网络协议·信息与通信·通信·xdp