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()引入,仍出现类似文件缺失错误。
原因分析与解决办法
原因分析
- FetchContent流程冲突:手动调用
FetchContent_Populate后再执行FetchContent_MakeAvailable,打乱了CMake自动处理OpenCV构建的流程,导致部分模块(如gapi)未被正确触发编译。 - 链接目标名称不匹配:
add_executable创建的目标是IC,但target_link_libraries中使用了不存在的ImaCrypt,依赖传递异常可能引发间接的模块缺失问题。 - 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
相关产品推荐
相关产品推荐

