VTK 无法解析的外部符号的解决办法

时间:2024-05-19 15:50:24

当你VTk所有目录和链接库加入到属性页中后,或许还会遇见一个让人头疼的问题:

VTK 无法解析的外部符号的解决办法

这是为什么呢?

大部分新手可能都是在配置完毕后亟不可待地在网上找了一段测试代码就进行测试,并没有考虑测试代码之中的陷阱。然后就出现了这个问题。

其实这个问题的原因就在程序开头两句:

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL) 
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)

 

这两句时6.0版本之前用的,官方有文档说明:

“If you are using an older version of VTK (6.0 or master from before the date above) than you can try including this snippet in all your code that includes VTK usage, BEFORE including ANY VTK header files:
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL) #define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)”

在6.0之后,要改成下面两句:

#include <vtkAutoInit.h> 
VTK_MODULE_INIT(vtkRenderingOpenGL);

根据需要还有:

VTK_MODULE_INIT(vtkRenderingFreeTypeOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);

等。

修改后,程序就可以顺利运行了。


其实有些简单的问题是很容易解决的,但类似于vtk、itk、opencv这种需要配置库文件等等的项目很容易报一些无从下手的错误,让新手一脸蒙逼,比如下面这种,我自己配置好多次也还是会遇到。

VTK 无法解析的外部符号的解决办法

在错误列表里,显示一堆“无法解析的外部符号”,同时出错的文件是.obj链接文件,也就是源代码是没有语法错误的,这时候你双击这些错误也不会跳转到具体语句。

看后面可以看出,关于vtk我用到的很多函数都出了问题,这就说明配置项目的时候有问题。


解决方法:

1.点击左侧解决方案管理器下方的"属性管理器”(或者直接右击项目属性),然后双击图中2的位置。

VTK 无法解析的外部符号的解决办法

2.弹出如下对话框:这个对话框是配置中用到的,但基本所有配置都不会讲这些配置有问题会出什么错。(相信看到这些所有人都会很眼熟,但很多莫名其妙的错误就是这些配置引起的)

一个是包含目录:这个指的是去哪里找vtk、itk的头文件。

VTK 无法解析的外部符号的解决办法

一个是库目录:库目录是所有的lib文件,比如我打开我的vtk库目录,下图。(这个在配置的时候最好去你安装vtk的目录下找到这个文件夹,看看有没有.lib的文件,因为有很多Debug文件夹,里面有的是没有.lib的,那就说明配错了。)

VTK 无法解析的外部符号的解决办法

在确定你配置的库目录下有很多.lib文件后,就可以下一步了。

这个目录设置好后只为了让我们去添加另一个东西

VTK 无法解析的外部符号的解决办法VTK 无法解析的外部符号的解决办法

可以看到附加依赖项是很多.lib文件,如果你的项目这里没有关于vtk的.lib就会出现文章开始的报错,同时还有一点,这里的.lib是相对路径,原因就是上面配置了库目录的目录位置,所以系统就知道去那几个文件夹里去找.lib,如果那几个文件夹没有你在这里写的.lib就会说

VTK 无法解析的外部符号的解决办法

而且这个报错会一个个出,一般我们配置会粘进来很多.lib,即使所有.lib都找不到,他每次只说找不到这一个,出现这个问题的时候说明,库目录配置错了。

当提示找不到文件时,你要进到vtk的目录下,看看是否有这个.lib文件,如果没有直接在附加依赖项中把这个删掉,很多配置从网上粘过来的时候,由于vtk版本的不同,导致.lib不完全相同,没有的直接去掉就好。

在附加依赖项配置时,也可以写绝对路径,这时候你库目录那里的配置就不重要了。

VTK 无法解析的外部符号的解决办法

比如,在这个项目中,我是用cmake配置的项目,我打开附加依赖项发现关于vtk的库文件都是绝对路径的,cmake的好处就是省去上面配置的过程,用cmakelists.txt去把这些工作命令给电脑自动完成。