经过一些研究,我发现没有为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-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
。各个编译器(本机编译器和交叉编译器)是使用它们各自的配置构建的,而不是使用其他配置构建的,并且不搜索(很好)通用路径。
关于ubuntu - 在RaspberryPi 3B +问题上交叉编译ROS Melodic,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55081522/