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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zy2317878/article/details/82926053

写在前面

由于实验室需要,需要重新编译医学图像第三方库全家桶。这里就需要编译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

要编译这个模块,需要依赖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提供的错误信息找到错误的解决方法。这算是一种经验的积累吧。虽然定位错误的方法以猜居多。如果读者看到了我这种不成熟的方法,希望能多多批评指正。谢谢大家。

猜你喜欢

转载自blog.csdn.net/zy2317878/article/details/82926053
今日推荐