[英]Cross-Compiling ROS Melodic on RaspberryPi 3B+ Problem
經過一些研究,我發現沒有為RaspberryPi交叉編譯ROS的單一“可靠的”方法。 我能想到的最好的方法是將/usr
, /lib
和/opt
從目標設備下載到我的開發機器上(安裝在$HOME/Projects/TargetResources
),制作CMake工具鏈文件,並調用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 sysroot/usr/include
目錄中找不到的依賴項(例如log4cxx/level.h
)。 同樣,解決共享庫依賴關系也很麻煩。
看來問題出在交叉編譯工具本身:使用來自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
。 各個編譯器(本機編譯器和交叉編譯器)是使用它們各自的配置構建的,而不是使用其他配置構建的,並且不搜索(很好)通用路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.