Rasberry Pi 크로스 컴파일 설정에서 Config.cmake 누락 오류
컴파일 시간을 단축하기 위해 우분투 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})
답변
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
시나리오에서는 패키지가 사용자 지정 위치에 설치되어 있습니다.
cmake 설명서 에서 다음을 시도해 볼 수 있습니다 .
기본 검색 순서는 일반적인 사용 사례에 대해 가장 구체적인 것부터 가장 적은 순서로 설계되었습니다. 프로젝트는 단순히 명령을 여러 번 호출하고 NO_ * 옵션을 사용하여 순서를 재정의 할 수 있습니다.
find_package (<package> PATHS paths... NO_DEFAULT_PATH)
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()