经过研究,我发现没有为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
)。同样,解决共享库依赖关系也很麻烦。
答案 0 :(得分:0)
问题似乎是由交叉编译工具本身引起的:使用https://github.com/raspberrypi/tools中的arm-linux-gnueabihf-gcc
和arm-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
。各自的编译器(本机和交叉编译)是使用各自的配置构建的,而不是其他配置,并且不搜索(很好)通用路径。