链接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
相关产品推荐
相关产品推荐

