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

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

配置

toolchain文件:

#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环境下的以下文件到交叉编译环境下:

/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 环境下的链接重新建立软链接即可

交叉编译指令:

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配置文件如下:

#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即可

apt install qt5-default

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

apt install qtbase5-dev

ROS2 humble交叉编译环境配置的更多相关文章

  1. 学习记录:交叉编译环境配置(buildroot and gdb&gdbserver)【转】

    本文转载自:https://blog.csdn.net/zhy025907/article/details/52332528 1,背景 因为参加公司的路由器逆向培训,首先需要的就是环境的配置准备工作, ...

  2. 【cocos 2d-x】VS2013+cocos2d-x3.3Final+Adriod交叉编译环境配置(超详细版)

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...

  3. RaspberryPi交叉编译环境配置-Ubuntu & wiringPi & Qt

    1.配置RaspberryPi交叉编译环境: 在开发RaspberryPi Zero的过程中,由于Zero板卡的CPU的处理性能比较弱,因此其编译的性能比较弱,需要将代码在PC电脑上交叉编译完成之后再 ...

  4. MT7688交叉编译环境配置

    在ubuntu下设置MT7688交叉编译环境,用于编译mt7688下使用的程序 1.首先在vmware下安装ubuntu64位,由于交叉编译工具需要64位系统,此次安装的是ubuntu14 2.在ub ...

  5. 关于Linux的交叉编译环境配置中的问题

    Linux的交叉编译arm-linux-gcc搭建时,安装结束却无法查看版本.输入以下命令查看Ubuntu的版本: uname -a 可以看到此Ubuntu为64位16.04.1版本,所以需要下载32 ...

  6. Qtwebkit配置,设置交叉编译环境 - croop520的专栏 - 博客频道 - CSDN.NET

    Qtwebkit配置,设置交叉编译环境 - croop520的专栏 - 博客频道 - CSDN.NET Qtwebkit配置,设置交叉编译环境 分类: Qt Webkit 2012-04-12 15: ...

  7. Ubuntu14.04配置gcc4.4.4+Qt4.8.4交叉编译环境

    安装32位程序运行支持 sudo apt-get install lib32stdc++6 lib32z1 lib32ncurses5 lib32bz2-1.0 可能报错: lib32stdc++6 ...

  8. 【基于mini2440开发板的交叉编译环境及内核树配置.

    在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙...笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大多 ...

  9. ubuntu QT安装以及配置交叉编译环境

    我的环境:ubuntu14.04  64位 1.下载Qt: 上网搜索 qt-opensource-linux-x64-5.3.0.run下载有好多百度云盘 要么在官网下载追新版本http://down ...

  10. Windows环境下搭建Cocos2d-x3.2环境并配置android交叉编译环境

    一.软件 1)VS2012(C++11特性在VS2012以上可以使用):传送门: 2)Cocos2d-x官网源码:传送门:http://cocos2d-x.org/download 3)JDK:传送门 ...

随机推荐

  1. [转帖]MySQL定点数类型DECIMAL用法详解

    https://www.cnblogs.com/danielzzz/p/16824214.html 一.MySQL DECIMAL 的使用 DECIMAL 数据类型用于在数据库中存储精确的数值,我们经 ...

  2. [转帖]【基础】HTTP、TCP/IP 协议的原理及应用

    https://juejin.cn/post/6844903938232156167 前言 本文将持续记录笔者在学习过程中掌握的一些 HTTP .TCP/IP 的原理,以及这些网络通信技术的一些应用场 ...

  3. [转帖] 请求量突增一下,系统有效QPS为何下降很多?

    https://www.cnblogs.com/codelogs/p/17056485.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 最近我观察到一 ...

  4. [转帖]iptables命令详解和举例(完整版)

    1.防火墙概述 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底 ...

  5. CentOS7 RPM离线安装PG12的办法

    1. 先需要下载相应的rpm包 地址 https://pkgs.org/search/?q=postgresql12 一般至少要下载如下四个包 postgresql12-12.3-1PGDG.rhel ...

  6. ant-design-vue 表单验证详解

    表单验证详解 <template> <!-- 第一个坑 :model="formState.youForm" 一定要写成这样 不要写成:model="f ...

  7. 基于.Net Core3.1 MVC + EF Core的项目(一)框架的初步搭建

    项目暂时分为六大块,结构如图所示 代码地址是  https://github.com/hudean/VacantCloud-   里面有许多没有完成,不过一些大致的内容都写的差不多了,权限认证依赖注入 ...

  8. PaddleNLP--UIE(二)--小样本快速提升性能(含doccona标注)

    相关文章: 1.快递单中抽取关键信息[一]----基于BiGRU+CR+预训练的词向量优化 2.快递单信息抽取[二]基于ERNIE1.0至ErnieGram + CRF预训练模型 3.快递单信息抽取[ ...

  9. PE结构:VA&RVA&FOA 转换复习

    复习一下,不然会忘 1.imagebase 映像基地址 ,默认是0x400000 2.va 虚拟地址,载入OD后的地址,已经映射到内存的地址. 计算实际装入地址 VA imagebase (映像基址) ...

  10. C/C++ Qt 编译打包项目

    Qt程序编译后,需要去qt目录拷贝几个文件,与qt程序放在一起该程序才可以脱离开发环境而独立运行下去,在开发环境下编译好代码以后,还需要进行以下操作将其打包才可以在别的机器上正常运行. QT的下载地址 ...