在RaspberryPi 3B +问题上交叉编译ROS Melodic

时间:2019-03-09 20:13:44

标签: ubuntu cmake raspberry-pi ros catkin

经过研究,我发现没有为RaspberryPi交叉编译ROS的单一“可靠的”方法。我能想到的最好的办法是从目标设备下载/usr/lib/opt到我的开发机器上(安装在$HOME/Projects/TargetResources上),制作CMake Toolchain文件,然后调用catkin_make_isolated -DCMAKE_TOOLCHAIN_FILE=...。尽管构建过程开始了,但我遇到了一个立即错误:

$ catkin_make_isolated -DCMAKE_TOOLCHAIN_FILE=${HOME}/Projects/${MY_PROJ}/RPI3+_Melodic_Toolchain.cmake
CMake Error at ${HOME}/Projects/TargetResources/opt/ros/melodic/share/catkin/cmake/assert.cmake:17 (message):
Assertion failed: check for file existence, but filename
  (RT_LIBRARY-NOTFOUND) unset.  Message: RT Library

Call Stack (most recent call first):

  ${HOME}/Projects/TargetResources/opt/ros/melodic/share/catkin/cmake/tools/rt.cmake:42 (assert_file_exists)
  ${HOME}/Projects/TargetResources/opt/ros/melodic/share/catkin/cmake/all.cmake:159 (include)
  ${HOME}/Projects/TargetResources/opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:20 (include)
  CMakeLists.txt:10 (find_package)

进行一些挖掘后,目标设备(即RaspberryPi 3+)没有librt.so。有趣的是,如果我仅在设备上为项目运行catkin_make,一切都将成功构建。因此,我认为尝试安装它不是真的必要(或正确的解决方案)。

此外,我应该注意目标安装了ROS Melodic Base,而我的开发计算机上安装了ROS Melodic Desktop。我不确定这是否会导致我遇到的问题,但是我不想过早地排除它。

所以,我的问题是我应该如何进行?在设置工具链时我是否忽略了某些东西?还是我假设关于ROS / Catkin的某些东西是错误的?

在此先感谢您的帮助和考虑。

编辑/附录

根据要求,这是工具链文件:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)

SET(CMAKE_C_COMPILER   $ENV{HOME}/Projects/RpiDevTools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER $ENV{HOME}/Projects/RpiDevTools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-g++)

SET(CMAKE_FIND_ROOT_PATH $ENV{HOME}/Projects/RpiDevTools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/sysroot/)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

sysroot中,我复制了RaspberryPi的/opt目录,因为该目录是安装ROS Melodic库的地方。我发现这些库可能具有在RaspberryPi / Tools log4cxx/level.h目录中找不到的依赖项(例如sysroot/usr/include)。同样,解决共享库依赖关系也很麻烦。

1 个答案:

答案 0 :(得分:0)

问题似乎是由交叉编译工具本身引起的:使用https://github.com/raspberrypi/tools中的arm-linux-gnueabihf-gccarm-linux-gnueabihf-g++意味着编译器使用已知配置的libc库进行配置。例如,math.h包括bits/math-vector.h;在GitHub的RaspberryPi Tools中,该文件位于.../sysroot/usr/include/bits,而直接从RaspberryPi 3B +本身复制的文件位于/usr/include/arm-linux-gnueabf/bits。各自的编译器(本机和交叉编译)是使用各自的配置构建的,而不是其他配置,并且不搜索(很好)通用路径。