热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

1.错误描述opencv4.0.0libtorch1.0.0(官网下载,非源码安装)gccversion5.4.020160609(Ubuntu5.4.0-6ubuntu1~16.
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.错误原因

类似的参考资料

  • github上相同的issue及解答
  • 由于C++类库版本不同导致的OpenCV编译链接错误
  • 利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测

原因如下:

# 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 ..

  • 有人说添加这样的头文件,来源OpenCV4.0+VS2017下运行程序总是出现未定义标识符, 我发现这个方法的时候已经,转战到opencv3.4版本了,所以没有测试. 这种办法后面实测了,行不通呀!

#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


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 32位ubuntu编译android studio,32位Ubuntu编译Android 4.0.4问题
    问题一:在32位Ubuntu12.04上编译Android4.0.4源码时,出现了关于emulator的错误,关键是其Makefile里的 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Linux 程序设计学习笔记----动手编写makefile文件
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
琴瑟_0203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有