Config.cmake отсутствует ошибка в настройке кросс-компиляции Rasberry Pi

Aug 19 2020

Я пытаюсь создать систему кросс-компиляции на ubuntu 16.04, чтобы сократить время компиляции.

Я установил инструменты и скопировал библиотеки с raspberry pi, и, безусловно, простой пример «Hello world» работает очень хорошо.

Проблема возникла, когда я попытался собрать программу с cmake и opencv. Очевидно, он не находит OpenCVConfig.cmake в хост-системе, поскольку он существует только в rpi в следующей папке:

/ USR / локальные / lib / cmake / opencv4 $

Могу ли я просто скопировать папку / usr / local / lib / cmake на хост-компьютер и вручную изменить путь установки библиотеки или как мне это сделать?

Сообщение об ошибке:

Не удалось найти файл конфигурации пакета, предоставленный «OpenCV» с любым из следующих имен:

OpenCVConfig.cmake
opencv-config.cmake

Добавьте префикс установки «OpenCV» в CMAKE_PREFIX_PATH или установите «OpenCV_DIR» в каталог, содержащий один из вышеуказанных файлов. Если «OpenCV» предоставляет отдельный пакет разработки или SDK, убедитесь, что он установлен.

Мой CMakeLists.txt:

set(CMAKE_BUILD_TYPE Release)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)


SET(CMAKE_C_COMPILER $ENV{HOME}/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER $ENV{HOME}/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++) # Where is the target environment SET(CMAKE_FIND_ROOT_PATH $ENV{HOME}/raspi/sysroot)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${CMAKE_FIND_ROOT_PATH}")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${CMAKE_FIND_ROOT_PATH}")
SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --sysroot=${CMAKE_FIND_ROOT_PATH}")

# Search for programs only in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# Search for libraries and headers only in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)


set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -fopenmp")

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp") find_package( OpenCV REQUIRED ) find_library(LIB_RT rt) list(APPEND LINK_LIBS ${OpenCV_LIBS}
)


include_directories(
  ${OpenCV_INCLUDE_DIRS} ) set(SOURCE opencvdemo.cpp) add_executable(vc_opencv_demo ${SOURCE})
target_link_libraries(vc_opencv_demo ${LIB_RT} ${LINK_LIBS})

Ответы

1 t2solve Aug 27 2020 at 19:05

Я бы посоветовал вам использовать в целом некоторые опции cmake для кросс-компиляции Linux:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_SYSROOT /home/devel/rasp-pi-rootfs)
set(CMAKE_STAGING_PREFIX /home/devel/stage)

set(tools /home/devel/gcc-4.7-linaro-rpi-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

см. ссылку, где объясняются параметры

Простым решением для меня было добавить следующий файл (или написать свой):https://github.com/opencv/opencv/blob/2f4e38c8313ff313de7c41141d56d945d91f47cf/cmake/OpenCVConfig.cmake

в папку "cmake-modules", где находится ваш CmakeLists.txt, например:

cmake-modules/FindOpenCV.cmake

Тогда добавьте

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules)

перед вызовом find_package (OpenCV)

Еще одна идея для быстрого исправления - использовать системную переменную, чтобы указать, где найти opencv lib для разных целей cmake, вызывая команду follwing из командной строки перед вызовом cmake:

export CMAKE_PREFIX_PATH=opencv_installation_folder/build

или же

export OpenCV_DIR=opencv_installation_folder/build

или напишите в вашем файле cmake

set (OpenCV_DIR /home/cmake/opencv/compiled) #change the path to match your complied directory of opencv

1 vvg Aug 26 2020 at 20:43

В вашем сценарии пакет установлен в произвольном месте.

Вы можете попробовать следующее (из руководства по cmake ):

Порядок поиска по умолчанию разработан так, чтобы быть наиболее конкретным или наименее конкретным для общих случаев использования. Проекты могут переопределить порядок, просто вызывая команду несколько раз и используя параметры NO_ *:

find_package (<package> PATHS paths... NO_DEFAULT_PATH)

1 divhart Aug 27 2020 at 19:43

Я думаю, вам не хватает set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)конфигурации кросс-компиляции.

Также рекомендуется поместить все параметры кросс-компиляции в так называемый файл цепочки инструментов, а затем использовать cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchainfile/raspberrypi.cmake ..

Другой вариант - собрать OpenCV из исходного кода, поэтому вам не нужно беспокоиться, если он уже упакован в вашу цепочку инструментов. Заменить find_packageна:

include(FetchContent)
FetchContent_Declare(
  opencv
  GIT_REPOSITORY https://github.com/opencv/opencv.git
  GIT_TAG 4.4.0)

FetchContent_GetProperties(opencv)
if(NOT opencv_POPULATED)
  FetchContent_Populate(opencv)
  add_subdirectory(${opencv_SOURCE_DIR} ${opencv_BINARY_DIR})
endif()