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
相关推荐
北冥湖畔的燕雀2 小时前
C++泛型编程(函数模板以及类模板)
开发语言·c++
ting_zh4 小时前
Cortex-M 中断机制基础
arm
Larry_Yanan6 小时前
QML学习笔记(四十二)QML的MessageDialog
c++·笔记·qt·学习·ui
R-G-B6 小时前
【35】MFC入门到精通——MFC运行 不显示对话框 MFC界面不显示
c++·mfc·mfc运行 不显界面·mfc界面不显示
大聪明-PLUS7 小时前
QEMU:如何组织与 I2C 设备的透明交互
linux·嵌入式·arm·smarc
Madison-No77 小时前
【C++】探秘vector的底层实现
java·c++·算法
晚风残7 小时前
【C++ Primer】第十二章:动态内存管理
开发语言·c++·c++ primer
liu****7 小时前
8.list的模拟实现
linux·数据结构·c++·算法·list
保持低旋律节奏8 小时前
C++ stack、queue栈和队列的使用——附加算法题
c++
初圣魔门首席弟子8 小时前
【C++ 学习】单词统计器:从 “代码乱炖” 到 “清晰可品” 的复习笔记
开发语言·c++