Pytorch_2: libtorch导致OPENCV错误:对‘cv::imread(std::string const&, int)’未定义的引用

1.错误描述

  • opencv 4.0.0
  • libtorch1.0.0 (官网下载,非源码安装)
  • gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11)
  • cmake version 3.5.1
Scanning dependencies of target frameworks
[ 50%] Building CXX object CMakeFiles/frameworks.dir/main.cpp.o
[100%] Linking CXX executable frameworks
CMakeFiles/frameworks.dir/main.cpp.o:在函数‘main’中:
/media/xx/data/cpps/frameworks/main.cpp:26:对‘cv::imread(std::string const&, int)’未定义的引用
collect2: error: ld returned 1 exit status
CMakeFiles/frameworks.dir/build.make:159: recipe for target 'frameworks' failed
make[3]: *** [frameworks] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/frameworks.dir/all' failed
make[2]: *** [CMakeFiles/frameworks.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/frameworks.dir/rule' failed
make[1]: *** [CMakeFiles/frameworks.dir/rule] Error 2
Makefile:118: recipe for target 'frameworks' failed
make: *** [frameworks] Error 2

2.错误原因

类似的参考资料

原因如下:

# TorchConfig.cmake  line 71
# When we build libtorch with the old GCC ABI, dependent libraries must too.
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  set(TORCH_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0")
endif()

(经过诸位大神的分析)TorchConfig.cmake文件中,让ABI=0,具体意思我也不大懂,貌似就关闭了CXX11_ABI,而opencv的东东就在这个里面呀,所以冲突,导致“对‘cv::imread(std::string const&, int)’未定义的引用”,上面的第三个参考网址同样提到了这个问题.

3.解决办法

目前还在测试,主要考虑以下两个方面(opencv降版本,libtorch源码安装),测试结果我也会稍后告知.

  • 使用opencv3.4版本,(不想测试了,我同事说OK!),还是要装这个版本;
wget -c https://codeload.github.com/opencv/opencv/zip/3.4.3
wget -c https://codeload.github.com/opencv/opencv_contrib/tar.gz/3.4.3
cmake -D CMAKE_BUILD_TYPE=Releas \
           -D OPENCV_EXTRA_MODULES_PATH=/home/download/opencv_contrib-master/modules \
           -D WITH_TBB=ON \
           -D WITH_CUDA=OFF \
           -D WITH_CUBLAS=OFF \
           -D BUILD_NEW_PYTHON_SUPPORT=ON \
           -D WITH_V4L=ON \
           -D INSTALL_C_EXAMPLES=ON \
           -D INSTALL_PYTHON_EXAMPLES=ON \
           -D PYTHON2_EXECUTABLE=/usr/bin/python2 \
           -D PYTHON2_LIBRARY=/usr/lib/python2.7 \
           -D PYTHON2_INCLUDE_DIR=/usr/include/python2.7 \
           -D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ \
           -D PYTHON3_EXECUTABLE=/usr/bin/python3 \
           -D PYTHON3_LIBRARY=/usr/lib/python3.5 \
           -D PYTHON3_INCLUDE_DIR=/usr/include/python3.5 \
           -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3.5/dist-packages/numpy/core/include/ \
           -D BUILD_EXAMPLES=ON ..
#include "opencv2/imgproc/imgproc_c.h"
  • 使用源码安装libtorch(推荐),测试cv::imreadcv::imwrite成功.(划掉的部分应该是我搞错了)但是还是有未定义的引用问题发生在其他函数上面,cv::imshow,cv::namewindow,cv::waitkey等.所以我在重新源码安装libtorch的同时,opencv源码安装3.4.3版本.
    官方源码安装指南 https://github.com/pytorch/pytorch#from-source

法1.适合1.0rc版本,目前版本见法2

# libtorch的源码安装方法 
PYTORCH_COMMIT_ID="8619230"
git clone https://github.com/pytorch/pytorch.git
cd pytorch && git checkout ${PYTORCH_COMMIT_ID}
mkdir build && cd ./build
python3 ../tools/build_libtorch.py # 输出目录在./pytorch/pytorch/torch/lib/tmp_install

法2.源码安装pytorch1.2,@2019-06-10

conda activate torch # your conda env
conda install numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing #python的依赖项,不行就把conda换pip
# Add LAPACK support for the GPU if needed
conda install -c pytorch magma-cuda100 # or [magma-cuda92 | magma-cuda100 ] depending on your cuda version

git clone --recursive https://github.com/pytorch/pytorch # 下载源码
cd pytorch
# if you are updating an existing checkout
# 一直执行下面两行,直到没有错误发生,我的渣渣网,搞了几个小时。
git submodule sync
git submodule update --init --recursive #正常等待半小时

# 编译安装
python setup.py install #等待半小时

torchvision的源码安装 Torchvision 源码安装[Ubuntu]

git clone https://github.com/pytorch/vision.git
cd vision
python setup.py install

参考网

1.Building PyTorch with LibTorch From Source with CUDA Support
2.github的一些说明
3.利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测
4.https://github.com/pytorch/pytorch#from-source

    原文作者:闪电侠悟空
    原文地址: https://www.jianshu.com/p/6fe9214431c6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞