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

链接OpenCV与LibTorch时出现cv::imread未定义引用问题

问题:OpenCV与LibTorch/TorchVision共存时链接失败(未定义cv::imread/imwrite)

环境背景

  • 从源码编译带CUDA的OpenCV 4.5.4,安装路径/usr/local
  • C++项目基于CMake构建,需同时链接OpenCV、LibTorch(1.13版本,通过pip安装)、TorchVision
  • 核心静态库ObjectDetector构建正常,但可执行文件cnnTest在链接阶段报错

现有CMakeLists.txt配置

cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR)

set(CMAKE_C_COMPILER /usr/bin/gcc)
set(CMAKE_CXX_COMPILER /usr/bin/g++)
set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc)

set(Torch_DIR /usr/local/lib/python3.8/dist-packages/torch/share/cmake/Torch/)
set(TorchVision_DIR /usr/local/share/cmake/TorchVision/)
find_package(Torch 1.13 REQUIRED)
find_package(OpenCV 4.5.4 REQUIRED)

file(GLOB_RECURSE OBJ_SRC_FILES src/*.cpp)
# file(GLOB_RECURSE OD_HDR_FILES inc/*.hpp)

add_library(ObjectDetector STATIC ${OBJ_SRC_FILES})
target_include_directories(ObjectDetector PUBLIC inc)
target_link_libraries(ObjectDetector PUBLIC ${OpenCV_LIBS} ${TORCH_LIBRARIES} TorchVision::TorchVision)

add_executable(cnnTest exec/cnnTest.cpp)
target_link_libraries(cnnTest PUBLIC ObjectDetector )
set_target_properties(cnnTest PROPERTIES CXX_STANDARD 14)

链接错误信息

/usr/bin/ld: saturn/objectDetector/CMakeFiles/cnnTest.dir/exec/cnnTest.cpp.o: in function `main':
/home/dozer/git/project-saturn/saturn/objectDetector/exec/cnnTest.cpp:18: undefined reference to `cv::imread(std::string const&, int)'
/usr/bin/ld: /home/dozer/git/project-saturn/saturn/objectDetector/exec/cnnTest.cpp:37: undefined reference to `cv::imwrite(std::string const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

关键现象

  • 完整链接日志显示已引入libopencv_imgcodecs.so.4.5.4(该库包含imread/imwrite符号)
  • 单独链接OpenCV的示例程序可正常编译运行
  • 只要引入Torch库(即使代码中不调用任何Torch API),就会触发该错误,推测存在ABI或符号解析顺序冲突

解决方案

方案1:调整链接库顺序

链接器按顺序解析符号,将OpenCV库放在Torch系列库之后,确保OpenCV的符号优先被解析:

# 修改ObjectDetector的链接顺序
target_link_libraries(ObjectDetector PUBLIC ${TORCH_LIBRARIES} TorchVision::TorchVision ${OpenCV_LIBS})

方案2:强制指定OpenCV库的完整路径

跳过CMake变量展开,直接指定OpenCV核心库的完整路径,避免符号覆盖:

target_link_libraries(ObjectDetector PUBLIC 
    ${TORCH_LIBRARIES} 
    TorchVision::TorchVision
    /usr/local/lib/libopencv_core.so.4.5.4
    /usr/local/lib/libopencv_imgcodecs.so.4.5.4
    # 根据项目需求添加其他OpenCV库,比如libopencv_imgproc.so.4.5.4等
)

方案3:统一C++ ABI版本

pip安装的LibTorch可能使用了与本地编译OpenCV不同的C++ ABI(例如LibTorch默认关闭C++11 ABI,而OpenCV默认开启),在CMake中强制统一:

# 在find_package(Torch)之前添加该配置
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0")

若OpenCV编译时开启了C++11 ABI,则将值改为1,可通过OpenCV编译日志确认ABI选项。

验证步骤

修改CMake配置后,执行以下命令重新构建:

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:02:12