经过一些研究,我发现没有为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)。同样,解决共享库依赖关系也很麻烦。

最佳答案

看来问题出在交叉编译工具本身:使用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。各个编译器(本机编译器和交叉编译器)是使用它们各自的配置构建的,而不是使用其他配置构建的,并且不搜索(很好)通用路径。

关于ubuntu - 在RaspberryPi 3B +问题上交叉编译ROS Melodic,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55081522/

10-14 19:16