一文教你如何永久关闭PCL+VTK 在Windows环境下弹出的vtkOutputWindow
最近做PCL windows客户端开发,环境什么都配置好了,代码也跑起来了,但是烦人的事情来了,就是一运行就会弹出vtkOutputWindow,如下图:
网上查了一通,各种方法都不能解决,比如初始化前添加:
vtkObject::GlobalWarningDisplayOff();
这个实际上是有效果的,但只是针对是你当前项目下使用的vtk,而大部分人在Windows下用的PCL应该都是直接从github上releases页面下载的,也就是那个AllInOne的安装包,但这里PCL是编译好的,而且编译用的VTK库是没有关闭该警告窗口的。所以,网上那些文章里提到的解决方法都是对你无效的。
https://github.com/PointCloudLibrary/pcl/releases
划重点:解决方法就是重新编译PCL+VTK
简单步骤如下:
- 下载PCL-1.9.1-AllInOne-msvc2017-win64.exe 安装,因为自己编译也需要里面的第三方库,安装这个可以直接用里面的第三方库,省的自己再找。
- 下载PCL-1.9.1源码 github上下载 tag = pcl-1.9.1
- 下载VTK源码,https://vtk.org/download/
- 用CMAKE配置VTK,然后VS编译,如何编译文章很多就不多说,注意VTK_LEGACY_SILENT要打勾,这样就不会再弹出那个窗口了。
可以看下VTK源码中的vtkSetGet.h这个头文件中有这么一段代码:
#if defined(VTK_LEGACY_REMOVE) || defined(VTK_LEGACY_SILENT)
# define VTK_LEGACY_BODY(method, version)
# define VTK_LEGACY_REPLACED_BODY(method, version, replace)
#else
# define VTK_LEGACY_BODY(method, version) \
vtkGenericWarningMacro(#method " was deprecated for " version " and will be removed in a future version.")
# define VTK_LEGACY_REPLACED_BODY(method, version, replace) \
vtkGenericWarningMacro(#method " was deprecated for " version " and will be removed in a future version. Use " #replace " instead.")
#endif
所以,如果定义了VTK_LEGACY_SLIENT就不会调用vtkGenericWarningMacro这个方法,自然就没有Generic Warning窗口了。
- CMAKE配置PCL,如何配置文章也很多,需要的第三方库刚才第一步中的exe安装后也都有,只有VTK要用重新编译的版本就可以了。
所以,Windows上做PCL开发想要不弹出Generic Warning窗口(vtkOutputWindow),请自己重新编译PCL+VTK,这是一个漫长的等待过程!