【问题标题】:Including opencv with fetchcontent does not work包含带有 fetchcontent 的 opencv 不起作用
【发布时间】:2020-10-01 13:50:22
【问题描述】:

我正在尝试在我的 c++ 项目中包含 opencv。我希望 CMake 为我处理这个问题。

目前我需要在标签中包含 opencv:#include <opencv2/opencv.hpp>

_deps/opencv-src 目录中的文件虽然会抛出以下错误:

Scanning dependencies of target VisionC
Building CXX object CMakeFiles/VisionC.dir/main.cpp.o
In file included from /Users/koen/Vakken/MotionVision/VisionC/main.cpp:2:
/Users/koen/Vakken/MotionVision/VisionC/cmake-build-debug/_deps/opencv-src/include/opencv2/opencv.hpp:48:10: fatal error: 'opencv2/opencv_modules.hpp' file not found
#include "opencv2/opencv_modules.hpp"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

似乎文件不能包含自己的标题

我的 CMakeLists 文件仍然很简单:

cmake_minimum_required(VERSION 3.17)
project(VisionC)

set(CMAKE_CXX_STANDARD 20)

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})
    include_directories(${opencv_SOURCE_DIR}/include) # "/include" should be deleted somehow...
endif ()

FetchContent_MakeAvailable(opencv)

add_executable(VisionC main.cpp)

target_link_libraries(VisionC opencv_lib)

我认为 include_directories 行中的“/include”暗示该库包含在“高”目录中……我不知道应该如何更改它。如果我删除这一行,我必须包含 opencv,如 #include <include/opencv2/opencv.hpp>

【问题讨论】:

    标签: c++ opencv cmake


    【解决方案1】:

    我找到了解决方案,这是我现在的 cmakelists:

    cmake_minimum_required(VERSION 3.17)
    project(VisionC)
    
    set(CMAKE_CXX_STANDARD 20)
    
    # Fetch from git
    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)
    endif ()
    FetchContent_MakeAvailable(opencv)
    
    # Find on pc
    set(OpenCV_DIR ${CMAKE_CURRENT_BINARY_DIR})
    include_directories(${OpenCV_INCLUDE_DIRS})
    find_package(OpenCV REQUIRED)
    
    # Link
    add_executable(VisionC main.cpp)
    target_link_libraries(VisionC ${OpenCV_LIBS})
    

    【讨论】:

    • 由于FetchContent_MakeAvailable(opencv)遵循规范模式,您可以删除FetchContent_GetProperties/FetchContent_Populate,即一切都由FetchContent_MakeAvailable完成...参考:cmake.org/cmake/help/latest/module/…
    • 你说得对,我也觉得include_directories(${OpenCV_INCLUDE_DIRS})
    • 我尝试和你做同样的事情,但我有如下错误列表:Target "opencv_core" INTERFACE_INCLUDE_DIRECTORIES property contains path: "~/CLionProjects/vision/cmake-build-debug" which is prefixed in the build directory.你知道为什么吗?
    • 老实说,这是一个学校项目。我只是带着它跑。对不起。也许您可以简单地更改 INTERFACE_INCLUDE_DIRECTORIES 的值以排除该路径并查看会发生什么。老实说,如果你能解决这个问题,我想很多人将来会很开心!
    猜你喜欢
    • 2019-04-10
    • 2023-01-24
    • 2022-11-23
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多