使用CMake和Conan配置OpenCV时可执行文件链接报错如何解决
问题根源
- 你当前使用的
CONAN_LIBS_OPENCV变量仅包含OpenCV自身的静态库,未包含OpenCV依赖的第三方传递依赖库(报错里的Imf、Imath属于OpenEXR库,是OpenCV imgcodecs模块的依赖,除此之外还有libjpeg、libpng、zlib等一系列依赖)。 - 静态库构建阶段不会做全量符号解析,仅会打包编译生成的目标文件,因此你换成
add_library时不会触发链接错误;但可执行文件链接阶段要求所有未定义符号都能找到对应实现,因此就会出现大量未定义符号报错。
解决方案(无需额外引入外部库)
方案一:直接使用全量依赖库变量(改动最小)
直接修改CMakeLists.txt的target_link_libraries配置,将${CONAN_LIBS_OPENCV}替换为Conan导出的全量依赖库变量${CONAN_LIBS}即可,该变量已包含OpenCV以及其所有传递依赖的库列表:
target_link_libraries( ${PROJECT_NAME} PRIVATE ${CONAN_LIBS} )
原有构建流程无需修改,重新执行构建即可正常链接。
方案二:使用更规范的FindPackage模式(推荐)
- 修改
conanfile.txt的生成器配置:
[requires] opencv/4.5.2 [generators] cmake_find_package cmake_paths
- 修改CMakeLists.txt,移除conanbuildinfo相关逻辑,改用标准find_package调用:
cmake_minimum_required(VERSION 3.20) project(opencv-test) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS true) # 引入Conan生成的路径配置 include(${CMAKE_BINARY_DIR}/conan_paths.cmake) find_package(OpenCV REQUIRED) add_executable(${PROJECT_NAME} main.cpp) target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}) target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS})
该方案会自动处理所有传递依赖的链接逻辑,无需手动维护库列表,跨平台兼容性更好。
内容的提问来源于stack exchange,提问作者erryox
相关产品推荐
相关产品推荐

