【问题标题】:Config.cmake missing error in Rasberry pi cross compiling setupRaspberry pi 交叉编译设置中的 Config.cmake 缺失错误
【发布时间】:2020-12-07 23:27:03
【问题描述】:

我正在尝试在ubuntu 16.04上搭建一个交叉编译系统来缩短编译时间。

我已经安装了工具并从树莓派中复制了库,一个简单的“Hello world”示例绝对运行良好。

当我尝试使用 cmake 和 opencv 构建程序时出现问题。显然它在主机系统中找不到 OpenCVConfig.cmake,因为它只存在于 rpi 的以下文件夹中:

/usr/local/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})

【问题讨论】:

  • 你在使用python吗?
  • 我正在使用 c++。
  • pkg-config --modversion opencv4的命令结果是什么?
  • pkg-config --modversion opencv4 在 pkg-config 搜索路径中找不到包 opencv4。也许您应该将包含 `opencv4.pc' 的目录添加到 PKG_CONFIG_PATH 环境变量 No package 'opencv4' found
  • 这很奇怪。 Opencv 已安装,并且在 RPI 中编译良好。

标签: opencv cmake raspberry-pi arm cross-compiling


【解决方案1】:

我建议您一般使用一些 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)

查看link 选项说明

一个简单的解决方案对我来说是添加以下文件(或自己编写): 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目标的opencv lib 在调用 cmake 之前从 commadline 调用以下命令:

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

【讨论】:

    【解决方案2】:

    在您的场景中,您将软件包安装在自定义位置。

    您可以尝试以下方法(来自the cmake manual):

    默认搜索顺序旨在最具体地 最不具体的常见用例。项目可能会覆盖订单 只需多次调用命令并使用 NO_* 选项:

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

    【讨论】:

      【解决方案3】:

      我认为您在交叉编译配置中缺少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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-28
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 2020-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多