ROS之交叉编译配置
参考资料:
https://zhuanlan.zhihu.com/p/183819313
https://www.guyuehome.com/33759
1、原理
所谓的交叉编译,其实我们可以从编译原理上理解这个步骤,C++的编译大致可以分为预编译、编译和链接三个步骤,所以我们只要保证预编译和编译使用的编译工具是目标平台的配套工具,最后链接的库文件是目标平台的库文件,即可保证交叉编译的正确性。
下面以配置 x86 ubuntu 18.06 ROS melodic 交叉编译环境为例
2、环境
编译平台:x86_64 ubuntu 18.04
目标平台:arm ubuntu 18.04
ROS版本:ROS melodic for amd64
CPU架构:编译环境和运行环境都是64位
3、编译配置
首先在 目标平台 和 编译平台 上全部装好 ubuntu 18.04 和 ROS melodic 的环境并且保证无误
3.1、在x86上安装arm的编译工具链
sudo apt install gcc-aarch64-linux-gnu
sudo apt install g++-aarch64-linux-gnu
此工具在后面用于编译
安装完成后,可以使用以下两条指令查看工具版本
aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-g++ --version
3.2、复制ROS库
将 arm 平台中的 ROS 库拷贝到 x86 中,替换 x86 的 ROS 库文件(x86的最好先备份,用于后期),位置在 /opt/ros 目录下
执行后,该目录如下:
/opt/ros/melodic/ #这个是arm cpoy过来的/opt/ros/melodic整个目录
/opt/ros/melodic_bak/ #这个是x86原来的目录
之所以保留原先的目录,是因为 x86 的环境还需要使用的
下面这段和交叉编译无关
这时候,如果再次执行 roscore 会报错,原因是,现在的 roscore 执行的是 /opt/ros/melodic 目录下的环境,手动指定成 /opt/ros/melodic_bak/ 即可
source /opt/ros/melodic_bak/setup.bash
如果希望继续使用 x86 环境下的指令,需要指定 LD_LIBRARY_PATH 参数
export LD_LIBRARY_PATH=/opt/ros/melodic_bak/lib/
3.3、复制库
将下面三个目录复制到x86中,这两个目录下主要是 linux 平台的一些通用库
/lib
/usr/lib
/usr/include
/usr/local
路径任意,比如,本次放在 /home/robot/cross_compile 下,全路径为:
/home/robot/cross_compile/lib
/home/robot/cross_compile/usr/lib
/home/robot/cross_compile/usr/include
/home/robot/cross_compile/usr/local
该路径在后面编写工具链配置文件的时候会再用到
3.4、修改ROS编译链配置
编译文件 /opt/ros/melodic/share/catkin/cmake/tools/rt.cmake
if(NOT (APPLE OR WIN32 OR MINGW OR ANDROID))
修改为
if(NOT (APPLE OR WIN32 OR MINGW OR ANDROID OR UNIX))
3.5、编写ROS工具链配置
#File rostoolchain.cmake
INCLUDE(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME Linux)
message(STATUS "home path $ENV{HOME}")
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
set(CMAKE_CXX_FLAGS -fpermissive)
set(CMAKE_C_FLAGS -fpermissive)
# specify the cross compiler
#CMAKE_FORCE_C_COMPILER(aarch64-linux-gnu-gcc GNU)
#CMAKE_FORCE_CXX_COMPILER(aarch64-linux-gnu-g++ GNU)
set(CMAKE_FIND_ROOT_PATH /opt/ros/melodic $ENV{HOME}/cross_compile)
set(CMAKE_LIBRARY_PATH
# /opt/ros/melodic/lib/aarch64-linux-gnu
#$ENV{HOME}/cross_compile/opt/ros/melodic/lib
$ENV{HOME}/cross_compile/lib
$ENV{HOME}/cross_compile/usr/lib
$ENV{HOME}/cross_compile/usr/local/lib
$ENV{HOME}/cross_compile/lib/aarch64-linux-gnu
$ENV{HOME}/cross_compile/usr/lib/aarch64-linux-gnu)
set(CMAKE_INCLUDE_PATH
$ENV{HOME}/cross_compile/usr/include
$ENV{HOME}/cross_compile/usr/include/freetype2
$ENV{HOME}/cross_compile/usr/include/aarch64-linux-gnu
$ENV{HOME}/cross_compile/usr/local/include)
set(LD_LIBRARY_PATH
# /opt/ros/melodic/lib/aarch64-linux-gnu
#$ENV{HOME}/cross_compile/opt/ros/melodic/lib
$ENV{HOME}/cross_compile/lib
$ENV{HOME}/cross_compile/usr/lib
$ENV{HOME}/cross_compile/usr/local/lib
$ENV{HOME}/cross_compile/lib/aarch64-linux-gnu
$ENV{HOME}/cross_compile/usr/lib/aarch64-linux-gnu)
message(STATUS "rostoolchain LD_LIBRARY_PATH ${LD_LIBRARY_PATH}")
set(PYTHON_EXECUTABLE /usr/bin/python2.7)
#set(BOOST_ROOT $ENV{HOME}/cross_compile/usr)
#set(PCL_ROOT $ENV{HOME}/cross_compile/usr)
set(PCL_DIR $ENV{HOME}/cross_compile/usr/lib/aarch64-linux-gnu/cmake/pcl)
set(CMAKE_CROSSCOMPILING true)
message("${CMAKE_CROSSCOMPILING}")
# Have to set this one to BOTH, to allow CMake to find rospack
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)#FOR COMPILE TOOL WORKS
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
4、编译
使用 CMAKE_TOOLCHAIN_FILE 参数指定编译链配置文件,如:
catkin_make -DCMAKE_TOOLCHAIN_FILE=/home/robot/catkin_ws/rostoolchain.cmake
5、错误处理
5.1、roscpp 路径错误
修改 /opt/ros/melodic/share/roscpp/cmake/roscppConfig.cmake
set(libraries "roscpp;pthread;/home/robot/cross_compile/usr/lib/aarch64-linux-gnu/libboost_chrono.so;/home/robot/cross_compile/usr/lib/aarch64-linux-gnu/libboost_filesystem.so;/home/robot/cross_compile/usr/lib/aarch64-linux-gnu/libboost_system.so;/home/robot/cross_compile/usr/lib/aarch64-linux-gnu/libboost_signals.so;/home/robot/cross_compile/usr/lib/aarch64-linux-gnu/liblog4cxx.so")
5.2、链接过程中库文件错误
具体表现为,默认会从 /usr/lib/aarch64-linux-gnu 目录和 /lib/aarch64-linux-gnu 目录下寻找.so文件,实际上,我们需要从 /home/robot/cross_compile/usr/lib/aarch64-linux-gnu 和 /home/robot/cross_compile/lib/aarch64-linux-gnu 下查找,解决方法是建立软链接即可
sudo ln -s /home/robot/cross_compile/lib/aarch64-linux-gnu /lib/aarch64-linux-gnu
sudo ln -s /home/robot/cross_compile/usr/lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu
5.3、其他安装库错误
除了上述库外,一些后期安装库的链接错误(这些库可能是apt-get安装或者源码安装),具体表现在平台不匹配或者库找不到,这时候需要在对应平台的库copy到交叉编译环境下的指定目录(如 /home/robot/cross_compile )下,再统一在编译链文件中统一指定库路径即可
示例:
set(Qt5Gui_DIR /cross_compile/usr/lib/aarch64-linux-gnu/cmake/Qt5Gui)
ROS之交叉编译配置的更多相关文章
- CMake交叉编译配置
很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译.即在你host宿主机上要生成target目标机的程序.里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等 ...
- ubuntu16.04 ROS环境下配置和运行SVO
ubuntu16.04 ROS环境下配置和运行SVO https://blog.csdn.net/nnUyi/article/details/78005552
- ROS 环境变量配置
unbantu16.04 linux 版本, ros系统 kinetic版本 1. ros系统可以通过rospack find package_name / rosrun package_n ...
- ROS vpn (pptp) 配置及端口绑定配置
网络搜集 一. 按VPN的协议分类 VPN的隧道协议主要有三种,PPTP,L2TP和IPSec,其中PPTP和L2TP协议工作在OSI模型的第二层,又称为二层隧道协议:IPSec是第三层隧道协议,是最 ...
- SVO在ROS下的配置与运行
最近在做实验的时候,需要配置SVO,下面讲讲其中的过程以及遇到的问题: 首先说明配置环境:Ubuntu 14.04 + ROS indigo,ROS的安装我参考了ROS的官网上给出的教程:http:/ ...
- QT插件+ROS 1 安装配置
测试环境: 系统版本:Ubuntu14.04 ROS版本:indigo QT版本:5.8.0 QtCreator安装 1 安装前准备,安装相应的GNU开发工具集和OpenGL开发库, 请注意安装软件都 ...
- ROS安装,配置
ROS最好安装在Ubuntu系统,因为ROS目前在其他的系统中都是试验性的 ! <Learning ROS for Robotics Programming-- second Edition&g ...
- CodeTyphon跨平台交叉编译的配置
CodeTyphon和Lazarus的关系相当于就是ubuntu和linux的关系 不过CodeTyphon提供了很多一键配置即可使用的交叉编译配置,而Lazarus就比较麻烦了,我也没用Lazaru ...
- Ubuntu虚拟机+ROS+Android开发环境配置笔记
Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...
- ROS入门笔记(二):ROS安装与环境配置及卸载(重点)
ROS入门笔记(二):ROS安装与环境配置及卸载(重点) [TOC] 1 ROS安装步骤 1.1 ROS版本 ROS目前只支持在Linux系统上安装部署, 它的首选开发平台是Ubuntu. 发布时间 ...
随机推荐
- Spring 学习笔记(4)依赖注入 DI
本篇文章主要对 Spring 框架中的核心功能之一依赖注入 (DI,Dependency Injection) 进行介绍,也是采用 理论+实战 的方式给大家阐述其中的原理以及明确需要注意的地方. 相关 ...
- vivo 悟空活动中台 - 栅格布局方案
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/6O0CH0U_WE1YkPK75m-jDQ作者:悟空中台研发团队 一.背景 今天来给大家分享 ...
- 类加载机制-深入理解jvm
一.什么是类的加载: 如上图,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中.其中类装载器的作用其实就是类的加载. 二.原理 (类的加载过程及其最终 ...
- 一文读懂 Serverless 的起源、发展和落地实践
讲师 | 洛浩(阿里云云原生高级架构师) Serverless 的发展轨迹 **2012 年,Serverless 这个单词第一次出现,由 Iron 公司提出,字面意思就是不需要服务器.但是真正被 ...
- 《3D编程模式》写书-第4次记录
大家好,这段时间我完成了"再看设计原则"的初稿,包括了设计基础.单一职责原则.依赖倒置原则.接口隔离原则.合成复用原则.最少知识原则.开闭原则 目前我已经完成了所有的初稿,后面会进 ...
- 存储密码-ssh添加秘钥
- AI毕业设计生成器(基于AI大模型技术开发)
这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码.它基于几百个github上面开源的java和python项目,运用tengsorflow技术,训练出了AI大模型.基本实现了计算机毕业 ...
- pybind11
fatal error: Python.h: no such file or directory 在使用pybind11时,如果不做调整可能就会出现这样的情况,Python.h一般出现在usr/inc ...
- [转帖]字符集 AL32UTF8 和 UTF8
https://blog.51cto.com/comtv/383254# 文章标签职场休闲字符集 AL32UTF8 和 UTF8文章分类数据库阅读数1992 The difference betwee ...
- [转帖]云数据库是杀猪盘么,去掉中间商赚差价,aws数据库性能提升 10 倍!价格便宜十倍。
https://tidb.net/blog/021059f1 于是乎dba中的冯大嘴喊出了云数据库就是杀猪盘.让每个公司自建数据库. 那么有没有一种数据库又便宜又好用呢.有 哪就是tidb数据库. 之 ...