Пути перекрестной компиляции OpenCV

#c #opencv #cmake #cross-compiling

#c #opencv #cmake #перекрестная компиляция

Вопрос:

Я протестировал программы из руководства Myzhars для термокамеры jetsonNano FLIR (https://github.com/Myzhar/Lepton3_Jetson ) Я могу успешно запустить cmake и make на целевой платформе (jetson nano), однако я хотел бы иметь возможность кросс-компиляции с моего ПК x86_64 Linux.

Я (для начала) смонтировал Jetson в /mnt/ sysroot через `sudo sshfs -o follow_symlinks jetson @nano:/ /mnt/ sysroot и, как я и ожидал, наивный, я предположил, что с этого момента настройка кросс-компиляции будет простой. Я изменил свой cmakelist.txt так что теперь это выглядит примерно так:

 cmake_minimum_required (VERSION 3.14)

project (lepton3_jetson)

set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE)
set(CMAKE_DEBUG_POSTFIX "_d")

#########################################################
# FLAGS
set (CMAKE_CXX_STANDARD 17)
#########################################################


#crossCompile
set(sysroot /mnt/sysroot)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set (CMAKE_SYSROOT, ${sysroot})
SET(CMAKE_FIND_ROOT_PATH ${sysroot})

set(tools /opt/linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g  )
set(CROSSBIN ${tools})

# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${sysroot}" CACHE INTERNAL "" FORCE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${sysroot}" CACHE INTERNAL "" FORCE)
set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} --sysroot=${sysroot}" CACHE INTERNAL "" FORCE)
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} --sysroot=${sysroot}" CACHE INTERNAL "" FORCE)


#crossCompile end

# Letpon3 Library source code
add_subdirectory (grabber_lib)

# OpenCV demo
add_subdirectory (opencv_demo)

# Check Fever App
add_subdirectory (check_fever_app)

# Qt ZED app
find_package(Qt5 COMPONENTS Widgets)
find_package(ZED 3)

if(Qt5_FOUND AND ZED_FOUND)
   add_subdirectory(qt_check_fever)
endif()
  

Однако, похоже, я не могу заставить его работать так, как хотелось бы. В настоящее время с этой версией cmake я получаю сообщение об ошибке

 CMake Error at /usr/local/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:165 (message):
  Could NOT find BLAS (missing: BLAS_LIBRARIES)
Call Stack (most recent call first):
  /usr/local/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:458 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/share/cmake-3.18/Modules/FindBLAS.cmake:947 (find_package_handle_standard_args)
  /mnt/sysroot/usr/local/zed/zed-config.cmake:36 (find_package)
  CMakeLists.txt:53 (find_package)


CMake Warning at CMakeLists.txt:53 (find_package):
  Found package configuration file:

    /mnt/sysroot/usr/local/zed/zed-config.cmake

  but it set ZED_FOUND to FALSE so package "ZED" is considered to be NOT
  FOUND.


-- Configuring incomplete, errors occurred!
`
  

Правильно ли я понимаю, что он пытается найти библиотеки на хосте, а не на цели?

И почему?

Комментарии:

1. Строки между «#crossCompile» и «#crossCompile end» должны быть частью файла toolchain , используемого через cmake option -DCMAKE_TOOLCHAIN_FILE=<...> . Размещение этих строк в CMakeLists.txt после project() вызова неверно .

2. О, спасибо. Итак, я переместил эти строки в отдельный файл и вызываю cmake с опцией. Никаких изменений в функциональности.

3. Строка set (CMAKE_SYSROOT, ${sysroot}) должна быть без запятой. Обратите внимание, что при правильной настройке CMAKE_SYSROOT CMake автоматически интерпретирует его как один из CMAKE_FIND_ROOT_PATH и автоматически добавляет --sysroot опцию для компилятора.

4. Спасибо. Моя неопытность в cmake начинает казаться очевидной, не так ли. Однако — удалена запятая, результат все тот же : (

5. Мое (временное) решение: я подключил Jetson к /mnt/sysroot. У меня есть два набора файлов makefile — с одним я могу компилировать на целевом устройстве (jetson), а с другим создатель Qt на хосте может анализировать (но не компилировать) проект.

Ответ №1:

Для тех, у кого подобная проблема: я так и не добрался до полностью рабочего решения. Однако мне удалось создать cmakefile, который позволил мне, по крайней мере, проанализировать проект с помощью IDE на моем главном компьютере, а затем скомпилировать его на целевой.

Комментарии:

1. Но это скорее комментарий, чем ответ? Я думаю, вы можете изменить свой вопрос с помощью такого комментария.