Erreur config.cmake manquante dans la configuration de la compilation croisée de Rasberry pi

Aug 19 2020

J'essaye de construire un système de compilation croisée sur ubuntu 16.04 pour raccourcir le temps de compilation.

J'ai installé les outils et copié les bibliothèques à partir du raspberry pi et un exemple simple "Hello world" fonctionne très bien.

Le problème est survenu lorsque j'ai essayé de créer un programme avec cmake et opencv. Évidemment, il ne trouve pas OpenCVConfig.cmake dans le système hôte car il n'existe que sur rpi dans le dossier suivant:

/ usr / local / lib / cmake / opencv4 $

Puis-je simplement copier le dossier / usr / local / lib / cmake sur l'ordinateur hôte et modifier manuellement le chemin d'installation de la bibliothèque ou comment dois-je le faire?

Message d'erreur:

Impossible de trouver un fichier de configuration de package fourni par "OpenCV" avec l'un des noms suivants:

OpenCVConfig.cmake
opencv-config.cmake

Ajoutez le préfixe d'installation "OpenCV" à CMAKE_PREFIX_PATH ou définissez "OpenCV_DIR" dans un répertoire contenant l'un des fichiers ci-dessus. Si "OpenCV" fournit un package de développement ou un SDK séparé, assurez-vous qu'il a été installé.

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

Réponses

1 t2solve Aug 27 2020 at 19:05

Je vous suggère d'utiliser en général une option cmake pour la compilation croisée 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)

voir le lien où les options sont expliquées

Une solution simple pour moi était d'ajouter le fichier suivant (ou d'écrire le vôtre):https://github.com/opencv/opencv/blob/2f4e38c8313ff313de7c41141d56d945d91f47cf/cmake/OpenCVConfig.cmake

dans un dossier "cmake-modules" où se trouve votre CmakeLists.txt, par exemple:

cmake-modules/FindOpenCV.cmake

Alors s'il vous plaît ajouter

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

avant d'appeler find_package (OpenCV)

Une autre idée pour une solution rapide est d'utiliser la variable système pour exprimer, où trouver la lib opencv pour différentes cibles cmake en appelant la commande follwing depuis commadline avant d'appeler cmake:

export CMAKE_PREFIX_PATH=opencv_installation_folder/build

ou

export OpenCV_DIR=opencv_installation_folder/build

ou écrivez dans votre fichier 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

Dans votre scénario, le package est installé dans un emplacement personnalisé.

Vous pouvez essayer ce qui suit (à partir du manuel cmake ):

L'ordre de recherche par défaut est conçu pour être le plus spécifique au moins spécifique pour les cas d'utilisation courants. Les projets peuvent remplacer l'ordre en appelant simplement la commande plusieurs fois et en utilisant les options NO_ *:

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

1 divhart Aug 27 2020 at 19:43

Je pense qu'il vous manque un set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)dans votre configuration de compilation croisée.

Il est également recommandé de placer toutes vos options de compilation croisée dans un fichier de chaîne d'outils, puis d'utiliser cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchainfile/raspberrypi.cmake ..

Une autre option pourrait être de créer OpenCV à partir de la source, vous n'avez donc pas à vous inquiéter s'il est déjà emballé dans votre chaîne d'outils. Remplacez find_packagepar:

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