写在前面

由于实验室需要,需要重新编译医学图像第三方库全家桶。这里就需要编译OpenCV,而编译后查看编译的库文件中缺少一个opencv_viz2413d.lib文件(没错,这里可以看出我使用的OpenCV是opencv-2.4.13.6版本)。所以需要额外重新编译这个库。首先就会遇到一个问题:默认的OpenCV编译模块中是没有Viz的。经过我之前成功编译的CMAKE配置文件仔细对比,发现需要以来VTK库。后面会详细叙述。先罗列一下我的环境信息:

  • OpenCV:2.4.13.6
  • VTK:8.1.1
  • CMAKE:3.11.2
  • VS:VS2015_x64

此外,由于已经成功编译了,这个博客也不是一个教程,所以图相对缺乏,下面补一些其它相关类似的博客,可供参考:

  • OpenCV中Viz模块的安装(VS2015)
  • 【opencv】viz 3D虚拟空间模块编译及使用
  • build opencv viz module 配置VTK路径
  • 使用Opencv3.0新特征(Viz,TLD….)

我没说清楚的,或者大家存疑的地方可以参考以上一些博客,都是中文的,应该会有些帮助。

OpenCV_viz

要编译这个模块,需要依赖VTK库,所以需要在CMAKE中(提前勾选Grouped与Advanced,就在Search旁边),如下所示:

先勾选WITH_VTK,之后,点击Configure,就会出现VTK_DIR,然后需要选择之前编译好的VTK库的路径。其实这里是要找VTKConfig.cmake文件存在的路径。这里的VTKConfig.cmake是编译通过后的,install的VTK的库,而不是直接CMAKE configure产生的VTK编译文件。

使用Everything软件能很方便的找到所需要的文件(这个我是怕我以后忘了,多说一句)。

这样配置好以后,点击Configure,然后Generate,Open Project,就会打开对应的OpenCV工程,可以编译。

编译OpenCV工程

编译工程时其他库没有什么问题,出问题的是opencv_viz库,然后由于opencv_viz库出问题,导致其测试的库:opencv_test_viz也有问题。但总的说,就是opencv_viz库有问题。具体的问题与下面的类似:

1>     Creating library D:/opencv-build2/lib/Release/opencv_viz2413.lib and object D:/opencv-build2/lib/Release/opencv_viz2413.exp
1>vizcore.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class vtkOBJReader * __cdecl vtkOBJReader::New(void)" (__imp_?New@vtkOBJReader@@SAPEAV1@XZ) referenced in function "public: static class vtkSmartPointer<class vtkOBJReader> __cdecl vtkSmartPointer<class vtkOBJReader>::New(void)" (?New@?$vtkSmartPointer@VvtkOBJReader@@@@SA?AV1@XZ)
1>vizcore.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class vtkOBJReader * __cdecl vtkOBJReader::SafeDownCast(class vtkObjectBase *)" (__imp_?SafeDownCast@vtkOBJReader@@SAPEAV1@PEAVvtkObjectBase@@@Z) referenced in function "class cv::Mat __cdecl cv::viz::readCloud(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class cv::_OutputArray const &,class cv::_OutputArray const &)" (?readCloud@viz@cv@@YA?AVMat@2@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_OutputArray@2@1@Z)
1>vizcore.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class vtkSTLReader * __cdecl vtkSTLReader::SafeDownCast(class vtkObjectBase *)" (__imp_?SafeDownCast@vtkSTLReader@@SAPEAV1@PEAVvtkObjectBase@@@Z) referenced in function "class cv::Mat __cdecl cv::viz::readCloud(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class cv::_OutputArray const &,class cv::_OutputArray const &)" (?readCloud@viz@cv@@YA?AVMat@2@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_OutputArray@2@1@Z)
1>vizcore.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class vtkSTLReader * __cdecl vtkSTLReader::New(void)" (__imp_?New@vtkSTLReader@@SAPEAV1@XZ) referenced in function "public: static class vtkSmartPointer<class vtkSTLReader> __cdecl vtkSmartPointer<class vtkSTLReader>::New(void)" (?New@?$vtkSmartPointer@VvtkSTLReader@@@@SA?AV1@XZ)
1>D:\opencv-build2\bin\Release\opencv_viz2413.dll : fatal error LNK1120: 4 unresolved externals

总之就是无法解析的外部符号的LNK2019错误。这种问题目前我遇到的一般是lib库包含有问题。但根据错误信息,只能隐约知道是vtkOBJReader与vtkSTLReader两个有问题。在电脑上搜索了一下,发现都有对应的头文件。但是缺少对于的lib库。

由于VTK编译应该不会有问题,所以这里可能是在VTK其他库中使用到了这两个头文件。

所以下面就是我写这篇博客的重点。如何根据错误信息找到缺少对应的lib库文件。我目前的经验是:

根据源文件代码结构来查找。

比如这里的VTK,查找vtkOBJReader.h与vtkSTLReader.h两个头文件,发现都在VTK-8.1.1\IO\Geometry文件中,那就找找看有没有跟IO 与 Geometry相关的lib。可以使用通配符帮助查找。结果就找到了vtkIOGeometry.lib.这个库。然后查看opencv_viz这个项目的属性,发现没有这个库。添加,尝试重新编译这个项目,结果通过。所以这个BUG就解决了。

写在后面

我一直很头疼,不知道如何根据VS提供的错误信息找到错误的解决方法。这算是一种经验的积累吧。虽然定位错误的方法以猜居多。如果读者看到了我这种不成熟的方法,希望能多多批评指正。谢谢大家。

OpenCV_Viz——OpenCV中Viz的模块编译的无法解析的外部符号BUG相关推荐

  1. Opencv中3D显示模块viz安装

    Opencv中3D显示模块viz安装 文章目录 前言 安装cmake 编译viz 编译opencv 3.4.4 4.0.0 VS2015测试 前言    最近工作需要在VS2105中调用opencv的 ...

  2. VS编译出现无法解析的外部符号:qt_metacall metaObject(void) const qt_metacast

    背景:将qt源码移植到自己项目里的过程中,出现了一大堆无法解析的外部符号以及一堆的link错误,接下来我会从各个方面一一分析每种错误产生的原因 Qt-moc简单介绍:Qt 不是使用"标准的& ...

  3. Opencv中使用ocl模块遇到的问题

    报错:Assertion failed (localThreads[0] * localThreads[1] * localThreads[2] <= kernelWorkGroupSize) ...

  4. opencv中加入contrib模块

    一.到网上下载opencv_contrib-master.zip并解压 放到如下这样的目录 二.下载protobuf-cpp-3.1.0.tar.gz.v1.0.0a3.tar.gz.vgg_gene ...

  5. 一文详解OpenCV中的CUDA模块

    如果您使用OpenCV已有一段时间,那么您应该已经注意到,在大多数情况下,OpenCV都使用CPU,这并不总能保证您所需的性能.为了解决这个问题,OpenCV在2010年增加了一个新模块,该模块使用C ...

  6. OpenCV中Viz模块的安装(VS2015)

    背景 因工作需要使用openCV中的Viz模块,而默认的OpenCV包是不含viz模块的.故需特别安装,现将安装过程简要记录如下,以作备忘. OpenCV 2.4.13 VTK 7.1.1 CMake ...

  7. Windows7 32位机上,OpenCV中配置GPU操作步骤

    1.  查看本机配置,查看显卡类型是否支持NVIDIA GPU,本机显卡为NVIDIA GeForce 8400 GS: 2.  从http://www.nvidia.cn/Download/inde ...

  8. [OpenCV实战]39 在OpenCV中使用ArUco标记的增强现实

    文章目录 1 什么是ArUco标记? 2 在OpenCV中生成ArUco标记 3 检测Aruco标记 4 增强现实应用 5 总结和代码 5.1 生成aruco标记 5.2 使用aruco增强现实 6 ...

  9. OpenCV进阶(10)在 OpenCV 中使用 ArUco 标记的增强现实

    在这篇文章中,我们将解释什么是 ArUco 标记,以及如何使用 OpenCV 将它们用于简单的增强现实任务. ArUco 标记已经在增强现实.相机姿态估计和相机校准中使用了一段时间.让我们更多地了解它 ...

最新文章

  1. 一种用户-系统协同的概念模型
  2. thinkphp集成系列之phpmailer批量发送邮件
  3. hash 值重复_面试题:HashSet是如何保证元素不重复的
  4. java五子棋判断_JAVA 五子棋 判断输赢的代码实现
  5. NFT游戏Illuvium获500万美元种子轮融资,Framework Ventures领投
  6. CSS如何水平垂直居中?
  7. 【免费毕设】ASP.NET猜数游戏的设计与开发(源代码+lunwen)
  8. php单独使用blade模板引擎,laravel 基础教程 —— Blade 模板引擎
  9. 算法_EXCEL中 A表示第一列,B表示第二列...AA表示27列,AB表示28列,问随意一组字母是多少列
  10. Xshell清屏快捷键
  11. 如何将word公式粘贴到动易CMS里面
  12. Vision MLP(MLP-Mixer,RepMLP,ResMLP,gMLP,aMLP)
  13. mac下vscode代码格式化及其他常用快捷键
  14. Pythonz之路,Day1 基于Python3 转自金角大王
  15. 销量反弹,高管离职,苹果真的要改变高定价策略了?
  16. 华为在高端手机市场首尝被小米击败的滋味,这是一个信号
  17. OpenGL 入门 17:立方体贴图
  18. 易语言调用c 自定义数据类型,用__stdcall实现易语言调用C/C++的dll
  19. NEW RDSP MODE I (模拟,循环节)
  20. Python学习笔记(八)爬虫基础(正则和编解码)

热门文章

  1. “/Ox”和“/RTC1”命令行选项不兼容 或者 ml.exe 退出
  2. IIS Ceb文件允许下载
  3. 3D目标检测-BEVFormer、BEVDepth
  4. five86-2靶机渗透攻略
  5. oppoa57升级android版本,OPPO A57刷机教程_OPPO A57升级更新官方系统包
  6. Ubuntu18.04运行校园网客户端
  7. 软考 软件设计师 第五版+历年真题
  8. BarTender打开提示:错误消息#2622
  9. 令人愉快的 Nuxt3 教程 (二): 快速轻松地搭建博客
  10. 【GPS】GPS测试环境