Config.cmake falta error en la configuración de compilación cruzada de Rasberry pi

Aug 19 2020

Estoy tratando de construir un sistema de compilación cruzada en ubuntu 16.04 para acortar el tiempo de compilación.

He instalado las herramientas y he copiado las librerías del raspberry pi y definitivamente un ejemplo simple de "Hola mundo" funciona muy bien.

El problema ocurrió cuando intenté crear un programa con cmake y opencv. Obviamente, no encuentra OpenCVConfig.cmake en el sistema host, ya que solo existe en rpi en la siguiente carpeta:

/ usr / local / lib / cmake / opencv4 $

¿Puedo copiar la carpeta / usr / local / lib / cmake en la computadora host y modificar manualmente la ruta de instalación de la biblioteca o cómo debo hacerlo?

Mensaje de error:

No se pudo encontrar un archivo de configuración de paquete proporcionado por "OpenCV" con ninguno de los siguientes nombres:

OpenCVConfig.cmake
opencv-config.cmake

Agregue el prefijo de instalación de "OpenCV" a CMAKE_PREFIX_PATH o configure "OpenCV_DIR" en un directorio que contenga uno de los archivos anteriores. Si "OpenCV" proporciona un paquete de desarrollo o SDK por separado, asegúrese de que se haya instalado.

Mi 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})

Respuestas

1 t2solve Aug 27 2020 at 19:05

Le sugiero que use en general alguna opción de cmake para la compilación cruzada de 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)

ver el enlace donde se explican las opciones

Una solución simple para mí fue agregar el siguiente archivo (o escribir el tuyo propio):https://github.com/opencv/opencv/blob/2f4e38c8313ff313de7c41141d56d945d91f47cf/cmake/OpenCVConfig.cmake

a una carpeta "cmake-modules" donde se encuentra su CmakeLists.txt, por ejemplo:

cmake-modules/FindOpenCV.cmake

Entonces por favor agregue

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

antes de llamar a find_package (OpenCV)

Otra idea para una solución rápida es usar la variable del sistema para expresar, dónde encontrar la librería opencv para diferentes objetivos de cmake llamando al siguiente comando desde commadline antes de llamar a cmake:

export CMAKE_PREFIX_PATH=opencv_installation_folder/build

o

export OpenCV_DIR=opencv_installation_folder/build

o escribe dentro de tu archivo 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

En su escenario, tiene el paquete instalado en una ubicación personalizada.

Puede probar lo siguiente (del manual de cmake ):

El orden de búsqueda predeterminado está diseñado para ser del más específico al menos específico para casos de uso comunes. Los proyectos pueden anular el orden simplemente llamando al comando varias veces y usando las opciones NO_ *:

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

1 divhart Aug 27 2020 at 19:43

Creo que le falta un set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)en su configuración de compilación cruzada.

También es una buena práctica poner todas las opciones de compilación cruzada en un archivo de cadena de herramientas y luego usar cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchainfile/raspberrypi.cmake ..

Otra opción podría ser construir OpenCV desde la fuente, por lo que no necesita preocuparse si ya está empaquetado en su cadena de herramientas. Reemplazar find_packagecon:

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()