VTK|8.2.0升级到9.4.2遇到的问题及解决方法
上篇:VTK-8.2.0源码编译(Cmake+VS2022+Qt5.12.12)
文章目录
- 下载
- error C1083: 无法打开包括文件: “vtkSmartPointer.h”
- error C1083: 无法打开包括文件: “QVTKOpenGLWidget.h”: No such file or directory
- error C2039:"SetRenderWindow": 不是 "QVTKOpenGLNativeWidget" 的成员
- error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”
- error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: static class vtkOBJReader *
- VTK由8.2.0升级到9.4.2之后什么都不显示了,变成黑屏了
- 为什么之前vtk8.2.0没有这个问题而vtk9.4.2有这个问题?
- 根本原因:Qt3DExtras::Qt3DWindow
下载
VTK下载链接:https://vtk.org/download/
没有zip包下载tar.gz使用7z解压两次后再打包成zip包
error C1083: 无法打开包括文件: “vtkSmartPointer.h”
是由于 VTK 9.x 开始移除了顶级头文件(例如 vtkSmartPointer.h
)的默认包含路径。换句话说,VTK 9 不再默认把所有头文件放在一个扁平的 include
目录下,而是更强制模块化了。
✅ 解决方案
修改顶层cmake包含路径方式
将之前的导入形式
find_package(vtk 9.2.4 REQUIRED PATHS ${CMAKE_BINARY_DIR}/thirdparty/vtk-9.4.2/lib/cmake)
改为9.2.4版本的导入方式
set(VTK_DIR "${CMAKE_BINARY_DIR}/thirdparty/vtk-9.4.2/lib/cmake/vtk-9.4") # 注意路径是否正确
find_package(VTK REQUIRED COMPONENTSCommonCoreCommonDataModelFiltersSourcesInteractionStyleRenderingCoreRenderingFreeTypeRenderingOpenGL2
)
target_include_directories(projectname PRIVATE${VTK_USE_FILE}
)
error C1083: 无法打开包括文件: “QVTKOpenGLWidget.h”: No such file or directory
你从 VTK 8.2.0 升级到 9.2.4 后遇到 QVTKOpenGLWidget.h
无法找到的问题,是因为 VTK 9.x 的 Qt 模块发生了重大变化。以下是问题原因和解决方法:
❗问题分析
在 VTK 8.2 中,QVTKOpenGLWidget
是由模块 RenderingQt
提供的头文件:
#include <QVTKOpenGLWidget.h>
但在 VTK 9.0 之后,VTK 的 Qt 模块被彻底重构和拆分为 CMake 的模块系统,头文件的位置也发生变化,QVTKOpenGLWidget.h
被放到了:
<VTK_INSTALL_PREFIX>/include/vtk-9.2/QVTKOpenGLNativeWidget.h
而且原来的 QVTKOpenGLWidget
已被重命名为:
QVTKOpenGLNativeWidget
✅ 解决方案
步骤 1:修改头文件引用
将你的 .h
和 .cpp
文件中:
#include <QVTKOpenGLWidget.h>
改为:
#include <QVTKOpenGLNativeWidget.h>
并将类名 QVTKOpenGLWidget
改为:
QVTKOpenGLNativeWidget
✅ 注意:它继承自
QWidget
,接口基本相同,可以直接替换。
步骤 2:在 CMakeLists.txt
中启用 Qt 支持的模块
你必须添加 VTK 的 Qt 模块(至少):
find_package(VTK REQUIRED COMPONENTS...GUISupportQtRenderingQt
)
确保你链接了 Qt5 和 VTK 的 Qt 模块:
target_link_libraries(CDS...${VTK_LIBRARIES}Qt5::Widgets
)
步骤 3:设置 VTK_MODULE_ENABLE_VTK_GUISupportQt
为 YES
如果你是自己构建的 VTK,则需要重新配置 VTK 构建选项,确保以下选项打开:
选项 | 值 |
---|---|
VTK_GROUP_ENABLE_Qt | YES |
Module_vtkGUISupportQt | YES |
Module_vtkRenderingQt | YES |
否则上述头文件不会被安装。
增加启用 Qt 支持的模块后cmake编译失败,原因是vtk升级后解压编译的构建选项有所变化
从
set(VTK_CONFIGURE cmake -B ${VTK_ROOT}/src/${VTK_NAME}-build-G "${CMAKE_GENERATOR}" -A x64-S ${VTK_ROOT}/src/${VTK_NAME}-DCMAKE_INSTALL_PREFIX=${VTK_ROOT}-DVTK_Group_Qt=ON-DVTK_Group_StandAlone=ON-DVTK_Group_Rendering=ON-DVTK_BUILD_ALL_MODULES=OFF-DModule_vtkRenderingFreeType=ON-DModule_vtkRenderingAnnotation=ON
)
变为
set(VTK_CONFIGURE cmake -B ${VTK_ROOT}/src/${VTK_NAME}-build-G "${CMAKE_GENERATOR}" -A x64-S ${VTK_ROOT}/src/${VTK_NAME}-DCMAKE_INSTALL_PREFIX=${VTK_ROOT}# 启用核心模块-DVTK_GROUP_ENABLE_Qt=YES-DVTK_GROUP_ENABLE_StandAlone=YES-DVTK_GROUP_ENABLE_Rendering=YES# 显式开启你需要的模块-DModule_vtkRenderingOpenGL2=ON-DModule_vtkRenderingFreeType=ON-DModule_vtkRenderingAnnotation=ON-DModule_vtkInteractionStyle=ON-DModule_vtkGUISupportQt=ON-DModule_vtkRenderingQt=ON# 关闭构建全部模块以加快编译-DVTK_BUILD_ALL_MODULES=OFF
)
error C2039:“SetRenderWindow”: 不是 “QVTKOpenGLNativeWidget” 的成员
error C2039 : “GetInteractor”: 不是 “QVTKOpenGLNativeWidget” 的成员
这个报错说明你在使用 QVTKOpenGLNativeWidget
时调用了 SetRenderWindow
,但是 VTK 9.x 中 QVTKOpenGLNativeWidget
不再有这个成员函数。
所以代码应改为:
vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow =