#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. Но это скорее комментарий, чем ответ? Я думаю, вы можете изменить свой вопрос с помощью такого комментария.