参考资料:

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之交叉编译配置的更多相关文章

  1. CMake交叉编译配置

    很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译.即在你host宿主机上要生成target目标机的程序.里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等 ...

  2. ubuntu16.04 ROS环境下配置和运行SVO

    ubuntu16.04 ROS环境下配置和运行SVO https://blog.csdn.net/nnUyi/article/details/78005552

  3. ROS 环境变量配置

    unbantu16.04 linux 版本,  ros系统 kinetic版本 1. ros系统可以通过rospack find  package_name  /   rosrun package_n ...

  4. ROS vpn (pptp) 配置及端口绑定配置

    网络搜集 一. 按VPN的协议分类 VPN的隧道协议主要有三种,PPTP,L2TP和IPSec,其中PPTP和L2TP协议工作在OSI模型的第二层,又称为二层隧道协议:IPSec是第三层隧道协议,是最 ...

  5. SVO在ROS下的配置与运行

    最近在做实验的时候,需要配置SVO,下面讲讲其中的过程以及遇到的问题: 首先说明配置环境:Ubuntu 14.04 + ROS indigo,ROS的安装我参考了ROS的官网上给出的教程:http:/ ...

  6. QT插件+ROS 1 安装配置

    测试环境: 系统版本:Ubuntu14.04 ROS版本:indigo QT版本:5.8.0 QtCreator安装 1 安装前准备,安装相应的GNU开发工具集和OpenGL开发库, 请注意安装软件都 ...

  7. ROS安装,配置

    ROS最好安装在Ubuntu系统,因为ROS目前在其他的系统中都是试验性的 ! <Learning ROS for Robotics Programming-- second Edition&g ...

  8. CodeTyphon跨平台交叉编译的配置

    CodeTyphon和Lazarus的关系相当于就是ubuntu和linux的关系 不过CodeTyphon提供了很多一键配置即可使用的交叉编译配置,而Lazarus就比较麻烦了,我也没用Lazaru ...

  9. Ubuntu虚拟机+ROS+Android开发环境配置笔记

    Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...

  10. ROS入门笔记(二):ROS安装与环境配置及卸载(重点)

    ROS入门笔记(二):ROS安装与环境配置及卸载(重点) [TOC] 1 ROS安装步骤 1.1 ROS版本 ROS目前只支持在Linux系统上安装部署, 它的首选开发平台是Ubuntu. 发布时间 ...

随机推荐

  1. SpringBoot 项目实战 | 瑞吉外卖 Day01

    一.软件开发整体介绍 1.软件开发流程 2.角色分工 项目经理:对整个项目负责,任务分配.把控进度 产品经理:进行需求调研,输出需求调研文档.产品原型等 UI设计师:根据产品原型输出界面效果图 架构师 ...

  2. Codeforces 670C (离散化入门题)

    原题链接:https://codeforces.com/problemset/problem/670/C 题目大意: 有 n 个人,每人会且仅会一种语言. (n ≤ 2e5) 语言有各自的编号(≤ 1 ...

  3. 2017年第八届 蓝桥杯A组 C/C++决赛题解

    蓝桥杯历年国赛真题汇总:Here 1. 平方十位数 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比如:1026753849,就是其中最 ...

  4. PTA 天梯赛 L3-003 社交集群(并查集)

    当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友.一个"社交集群"是指部分兴趣爱好相同的人的集合.你需要找出所有的社交集群. 输入 ...

  5. asio 使用 openssl 示例

    #include <boost/asio.hpp> #include <boost/asio/ssl.hpp> #include <boost/algorithm/str ...

  6. Linux vim-go 开发环境搭建

    本文介绍 Linux 下 vim-go 的开发环境搭建.主要参考这篇博客进行的配置,其中记录了几个搭建环境时遇到的问题. 1. vim-go 开发环境搭建 1.1 用户隔离 由于使用的是共享宿主机,为 ...

  7. spring boot 整合kafka

    本文为博主原创,未经允许不得转载: 1. 引入spring boot kafka依赖 <dependency> <groupId>org.springframework.kaf ...

  8. [转帖]Shell三剑客之awk

    目录 awk简述 awk的工作过程 awk的工作原理 awk的基本格式及其内置变量 getline 文本内容匹配过滤打印 对字段进行处理打印 条件判断打印 awk的三元表达式与精准筛选用法 awk的精 ...

  9. vCenter 宕机后证书续期处理

    vCenter 宕机后证书续期处理 背景 最近护网, 我司被选中作为防守方 因为发现一个vCenter控制台出现异常访问, 被管理员强行断网. 因为是周六的事情,当时自己也没太在意,想着工作日添加网络 ...

  10. 【转帖】用pycharm开发django项目示例

    https://www.cnblogs.com/kylinlin/p/5184592.html pycharm开发django工程(一) 在pycharm(企业版)中新建Django工程,注意使用虚拟 ...