首页 > 其他分享 >ROS2 humble交叉编译环境配置

ROS2 humble交叉编译环境配置

时间:2024-02-25 20:34:22浏览次数:28  
标签:set CMAKE humble 编译 usr PATH ROOT FIND ROS2

目录

直接上干货,本文将介绍配置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

标签:set,CMAKE,humble,编译,usr,PATH,ROOT,FIND,ROS2
From: https://www.cnblogs.com/sherlock-lin/p/18032940

相关文章

  • UE5源码版本在多个工程来回切换时重复编译引擎问题
    细看UBT日志,已经给出了提示11>ParsingheadersforActionRPG11>RunningInternalUnrealHeaderToolD:\UEProject\ActionRPG\ActionRPG.uprojectD:\UEProject\ActionRPG\Intermediate\Build\Win64\ActionRPG\Development\ActionRPG.uhtmanifest-WarningsAsError......
  • 编译器负责转换源代码
    能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器。将C语言编写的源代码转换成本地代码的编译器称为C编译器。编译器首先读人代码的内容,然后再把源代码转换成本地代码。编译器中就好像有一个源代码同本地......
  • 3D Slicer编译错误:Variable Slicer_WC_LAST_CHANGED_DATE is expected to be defined.
    3DSlicer编译错误:VariableSlicer_WC_LAST_CHANGED_DATEisexpectedtobedefined. 解决:1、找到SlicerMacroExtractRepositoryInfo.cmake路径:F:\1_Slicer\CMake\SlicerMacroExtractRepositoryInfo.cmake2、添加 set(${wc_info_prefix}_WC_LAST_CHANGED_DATE"0000-00......
  • macos arm64 编译静态库
    下载ffmpeghttps://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2编译sudo./configure--enable-static--enable-gpl--enable-libx264--prefix=/opt/local--extra-cflags=-I/opt/local/include--extra-ldflags=-L/opt/local/lib--pkg-config-flags="--static&qu......
  • 六、多文件分离式编译
    六、多文件分离式编译分离式编译意味着将项目程序分离到几个文件当中,每个文件独立编译,通常用于C++项目当中。1.文件组织结构下面以一个阶乘示例来说明,一个文件夹下面共有3个文件,分别是主文件,被调用的函数所在文件和头文件:fact.cpp是被调用的子函数所在文件:#include"Chapter......
  • 3D Slicer编译错误,无法打开包括文件: “pthread.h”解决
    3DSlicer编译错误:fatalerrorC1083:无法打开包括文件:“pthread.h”:Nosuchfileordirectory解决方案:安装pthread库 1、下载pthread库pthreads-w32-2-9-1-release.zip地址:https://sourceforge.net/projects/pthreads4w/2、解压zip解压后,您应该能看到几个文件夹,......
  • lazarus3.0 /fpc3.3.1编译某些控件会出现:Error: Forward declaration not solved xxx
    最近用lazarus3.0/fpc3.3.1时发现原来在lazarus2.2.6/fpc3.2.2能编译安装的控件出现类似下面的提示codebot.text.xml.pas(129,10)Error:Forwarddeclarationnotsolved"NewDocument:IDocument;"解决方法:本例子参照DocumentCreate:IDocument,在实现部分编写过程。{$i......
  • vs2010 编译问题
       1.更改设置1.1  project->properties->configurationproperties->C/C++->General->AddtionalIncludeDirectories->放dll文件的路径1.2 project->properties->configurationproperties->Linker->General->AddtionalLibraryDirectories......
  • 编译型和解释型
    编译型理解:1.编译型通俗理解上来说就是对某一个东西通过固定工具进行编译成其他东西,这是一整个完成品举例:中国人小明,一个印度人小A,他俩分别写出了著名的书籍,如果小A想要月的小明的书籍,或者小明想要阅读小A的书籍。当然如果直接去看,是看不明白到底写的是什么,所以中间就出现了翻......
  • m基于码率兼容打孔LDPC码nms最小和译码算法的LDPC编译码matlab误码率仿真
    1.算法仿真效果matlab2022a仿真结果如下: 2.算法涉及理论知识概要       码率兼容打孔LDPC码BP译码算法是一种改进的LDPC译码算法,能够在不同码率下实现更好的译码性能。该算法通过在LDPC码中引入打孔操作,使得码率可以灵活地调整,同时利用BP(BeliefPropagation)译码算法......