You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake引入OpenCV 4.6.0报错:缺失libopencv_gapi.so.4.6.0

问题:CMake引入OpenCV 4.6.0时编译报错缺失libopencv_gapi.so.4.6.0

编译错误信息:

ninja: error: '_deps/opencv-build/lib/libopencv_gapi.so.4.6.0', needed by 'bin/ICTests', missing and no known rule to make it

简化后的CMakeLists.txt内容:

cmake_minimum_required(VERSION 3.12)
project(IC)

set(CMAKE_CXX_STANDARD 11)

find_package(OpenSSL REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIR})

include(FetchContent)
FetchContent_Declare(
        googletest
        URL https://github.com/google/googletest/archive/5376968f6948923e2411081fd9372e71a59d8e77.zip
)
FetchContent_MakeAvailable(googletest)

include(FetchContent)
FetchContent_Declare(
        opencv
        GIT_REPOSITORY https://github.com/opencv/opencv.git
        GIT_TAG        4.6.0
)
FetchContent_GetProperties(opencv)
if (NOT opencv_POPULATED)
    FetchContent_Populate(opencv)
endif ()
FetchContent_MakeAvailable(opencv)

set(SOURCES
        main.cpp
        )

set(HEADERS

        )

add_executable(IC ${SOURCES} ${HEADERS})
target_link_libraries(ImaCrypt ${OPENSSL_CRYPTO_LIBRARY} ${OpenCV_LIBS})

set(SOURCESTESTS
        )

set(HEADERSTESTS
        )

add_executable(ICTests tests/ImaCryptTests.cpp ${SOURCESTESTS} ${HEADERSTESTS})
target_link_libraries(ICTests ${OPENSSL_CRYPTO_LIBRARY} ${OpenCV_LIBS} gtest_main)

注:曾尝试手动编译OpenCV并通过find_package()引入,仍出现类似文件缺失错误。


原因分析与解决办法

原因分析

  1. FetchContent流程冲突:手动调用FetchContent_Populate后再执行FetchContent_MakeAvailable,打乱了CMake自动处理OpenCV构建的流程,导致部分模块(如gapi)未被正确触发编译。
  2. 链接目标名称不匹配:add_executable创建的目标是IC,但target_link_libraries中使用了不存在的ImaCrypt,依赖传递异常可能引发间接的模块缺失问题。
  3. OpenCV模块构建依赖:gapi模块依赖protobuf等第三方库,若环境缺失这些依赖,会导致该模块编译失败;部分版本OpenCV默认不编译gapi模块。

解决办法

1. 修正FetchContent使用方式

删除手动的FetchContent_GetProperties和FetchContent_Populate调用,直接用FetchContent_MakeAvailable完成全部流程,它会自动处理下载、配置、编译:

include(FetchContent)
FetchContent_Declare(
        opencv
        GIT_REPOSITORY https://github.com/opencv/opencv.git
        GIT_TAG        4.6.0
)
FetchContent_MakeAvailable(opencv)

2. 修正链接目标名称错误

将target_link_libraries中的目标名改为与add_executable一致:

target_link_libraries(IC ${OPENSSL_CRYPTO_LIBRARY} ${OpenCV_LIBS})

3. 显式控制OpenCV模块构建

如果不需要gapi模块,可指定只编译需要的核心模块,避免无效依赖:

set(OpenCV_BUILD_LIST core imgcodecs imgproc CACHE STRING "OpenCV modules to build")
FetchContent_MakeAvailable(opencv)

如果确实需要gapi模块,先确保环境安装了protobuf依赖,再显式启用:

set(BUILD_opencv_gapi ON CACHE BOOL "Build gapi module")
FetchContent_MakeAvailable(opencv)

4. 手动编译OpenCV的修正方案

  • 编译OpenCV时,通过ccmake或cmake-gui确认gapi模块已勾选,且所有依赖(如protobuf)已安装。
  • 安装完成后,确保find_package能正确定位到OpenCV:
find_package(OpenCV 4.6.0 REQUIRED PATHS "/your/opencv/install/path")
  • 编译OpenCV与当前项目使用相同的编译器、C++标准,避免ABI不兼容。

5. 清理构建缓存重新编译

删除现有构建目录,彻底重置CMake配置:

rm -rf build
mkdir build && cd build
cmake ..
ninja

内容的提问来源于stack exchange,提问作者DPRCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:13:23