ROS2 humble交叉编译环境配置
直接上干货,本文将介绍配置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() 能找到第三方包,却找不到用户自定义包
解决方法:
两种解决方法:
- CMAKE_FIND_ROOT_PATH_MODE_PACKAGE 设置为 BOTH,但这是交叉编译环境,这样设置会导致后续找包都会去系统目录下,可能会有问题;
- 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交叉编译环境配置的更多相关文章
- 学习记录:交叉编译环境配置(buildroot and gdb&gdbserver)【转】
本文转载自:https://blog.csdn.net/zhy025907/article/details/52332528 1,背景 因为参加公司的路由器逆向培训,首先需要的就是环境的配置准备工作, ...
- 【cocos 2d-x】VS2013+cocos2d-x3.3Final+Adriod交叉编译环境配置(超详细版)
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...
- RaspberryPi交叉编译环境配置-Ubuntu & wiringPi & Qt
1.配置RaspberryPi交叉编译环境: 在开发RaspberryPi Zero的过程中,由于Zero板卡的CPU的处理性能比较弱,因此其编译的性能比较弱,需要将代码在PC电脑上交叉编译完成之后再 ...
- MT7688交叉编译环境配置
在ubuntu下设置MT7688交叉编译环境,用于编译mt7688下使用的程序 1.首先在vmware下安装ubuntu64位,由于交叉编译工具需要64位系统,此次安装的是ubuntu14 2.在ub ...
- 关于Linux的交叉编译环境配置中的问题
Linux的交叉编译arm-linux-gcc搭建时,安装结束却无法查看版本.输入以下命令查看Ubuntu的版本: uname -a 可以看到此Ubuntu为64位16.04.1版本,所以需要下载32 ...
- Qtwebkit配置,设置交叉编译环境 - croop520的专栏 - 博客频道 - CSDN.NET
Qtwebkit配置,设置交叉编译环境 - croop520的专栏 - 博客频道 - CSDN.NET Qtwebkit配置,设置交叉编译环境 分类: Qt Webkit 2012-04-12 15: ...
- Ubuntu14.04配置gcc4.4.4+Qt4.8.4交叉编译环境
安装32位程序运行支持 sudo apt-get install lib32stdc++6 lib32z1 lib32ncurses5 lib32bz2-1.0 可能报错: lib32stdc++6 ...
- 【基于mini2440开发板的交叉编译环境及内核树配置.
在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙...笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大多 ...
- ubuntu QT安装以及配置交叉编译环境
我的环境:ubuntu14.04 64位 1.下载Qt: 上网搜索 qt-opensource-linux-x64-5.3.0.run下载有好多百度云盘 要么在官网下载追新版本http://down ...
- Windows环境下搭建Cocos2d-x3.2环境并配置android交叉编译环境
一.软件 1)VS2012(C++11特性在VS2012以上可以使用):传送门: 2)Cocos2d-x官网源码:传送门:http://cocos2d-x.org/download 3)JDK:传送门 ...
随机推荐
- [转帖]Jmeter跨线程组传参
https://www.cnblogs.com/a00ium/p/10462576.html 我们知道,同一线程组中可以通过"正则表达式提取器"获取其中一个取样器的响应结果中的 ...
- [转帖]ARM64体系结构编程与实践:基础知识
ARM64体系结构编程与实践:基础知识 原创 异步社区 2022-03-30 12:44:16 著作权 文章标签 寄存器 体系结构 v8 ARM64体系结构 ARM 文章分类 物联网 阅读数1570 ...
- Linux 环境下 node 以及 jit 的简单环境配置说明
注意事项: 1. 注意这个包需要实时更新. 2. 更新时需要按照目录覆盖文件. 3. 谁负责谁治理的态度, 有更新,需要完整的进行覆盖安装. 建议先删除旧文件, 替换新文件. 4. 为了简单起见, 直 ...
- SAP Gateway Trace
最近在SAP PE项目上遇到一个需求要求记录所有的ODATA(含S4/CLOUD API)的报文. Below T-codes recording logging and tracing: /IWFN ...
- 如何将axios封装成一个插件
01==>重新写axios的插件 在src下创建一个插件文件为plugins 在创建一个http.js文件 根据官方插件 重新写axios的插件 http.js文件如下 import axios ...
- 【解决一个小问题】proto文件中的enum,去掉长长的重复的enum名字
在proto中定义的enum,通常类型名字都会带上enum的前缀,很丑陋,如何去掉呢? enum DataSourceType{ NotUse = 0; MySQL = 1; ElasticSearc ...
- 【0基础学爬虫】爬虫基础之自动化工具 Pyppeteer 的使用
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...
- 【JS 逆向百例】cnki 学术翻译 AES 加密分析
关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...
- Golang Map底层实现简述
Go的map是一种高效的数据结构,用于存储键值对.其底层实现是一个哈希表(hash table),下面是有关map底层实现的详细介绍: 哈希表: map的底层实现是一个哈希表,也称为散列表.哈希表是一 ...
- 【springboot整合druid】java.sql.SQLException: url not set
问题描述 未使用自动装配的机制,实现springboot整合druid时(就是使用druid的jar包,而不是druid-spring-boot-starter)报错 <dependency&g ...