Кросс-компиляция ROS Melodic на RaspberryPi 3B + Проблема - PullRequest
2 голосов
/ 09 марта 2019

Проведя некоторые исследования, я обнаружил, что не существует ни одного проверенного способа кросс-компиляции ROS для RaspberryPi.Лучшее, что я мог придумать, - это загрузить /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, которое ложно?

Заранее благодарю за всю вашу помощь и внимание.

Редактировать/ Addendum

В соответствии с запросом, вот файл набора инструментов:

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,Я обнаружил, что эти библиотеки могут иметь зависимости (например, log4cxx/level.h), которых нет в каталоге RaspberryPi / Tools sysroot/usr/include.Аналогично, разрешение зависимостей общего объекта одинаково громоздко.

1 Ответ

0 голосов
/ 18 марта 2019

Похоже, что проблема связана с самими инструментами кросс-компиляции: использование arm-linux-gnueabihf-gcc & arm-linux-gnueabihf-g++ из https://github.com/raspberrypi/tools означает, что компиляторы настроены с библиотеками libc в заранее известной конфигурации.Например, math.h включает bits/math-vector.h;в RaspberryPi Tools от GitHub он расположен на .../sysroot/usr/include/bits, тогда как скопированный прямо с самого RaspberryPi 3B + находится на /usr/include/arm-linux-gnueabf/bits.Соответствующие компиляторы (нативный и кросс-компиляция) были собраны с соответствующими им конфигурациями, но не с остальными и не ищут (хорошо) обобщенные пути.

...