Rasberry Pi 크로스 컴파일 설정에서 Config.cmake 누락 오류

Aug 19 2020

컴파일 시간을 단축하기 위해 우분투 16.04에서 크로스 컴파일 시스템을 구축하려고합니다.

나는 도구를 설치하고 라즈베리 파이에서 libs를 복사했으며 확실히 간단한 "Hello world"예제가 매우 잘 작동합니다.

cmake 및 opencv로 프로그램을 빌드하려고 할 때 문제가 발생했습니다. 분명히 다음 폴더의 rpi에만 존재하므로 호스트 시스템에서 OpenCVConfig.cmake를 찾지 못합니다.

/ usr / local / lib / cmake / opencv4 $

/ usr / local / lib / cmake 폴더를 호스트 컴퓨터에 복사하고 라이브러리 설치 경로를 수동으로 수정할 수 있습니까? 아니면 어떻게해야합니까?

에러 메시지:

다음 이름을 가진 "OpenCV"에서 제공 한 패키지 구성 파일을 찾을 수 없습니다.

OpenCVConfig.cmake
opencv-config.cmake

CMAKE_PREFIX_PATH에 "OpenCV"의 설치 접두사를 추가하거나 "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

Linux 크로스 컴파일을 위해 일반적으로 cmake 옵션을 사용하는 것이 좋습니다.

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

CmakeLists.txt가있는 "cmake-modules"폴더로 이동합니다. 예 :

cmake-modules/FindOpenCV.cmake

그런 다음 추가하십시오

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

find_package (OpenCV)를 호출하기 전에

빠른 수정을위한 또 다른 아이디어 는 시스템 변수를 사용하여 표현하는 것입니다. cmake를 호출하기 전에 commadline에서 다음 명령을 호출하는 다른 cmake 대상에 대한 opencv lib를 찾을 수있는 위치입니다.

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