max、min宏定义、函数冲突
错误:
error C2589: “(”:“::”右边的非法标记
error C2059: 语法错误:“::”
error C2143: 语法错误 : 缺少“(”(在“::”的前面)
error C2059: 语法错误:“)”
原因:
因为Windef.h中定义了
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
vc的max宏和std::numeric_limits<>max()函数冲突
解决方法:
把报错的所有std::numeric_limits<>max()用括号括起来避免和windows定义的宏混淆,例如(std::numeric_limits::max)() 或 (std::max)();
或者在前面加上
#undef min
#ubdef max
折磨我半个月,这要是不一个个翻库代码,谁能发现啊!
pcl_visualizer.hpp中无效的整数常量表达式
错误
error C1017: 无效的整数常量表达式
原因
VTK_RENDERING_BACKEND_OPENGL_VERSION没有定义到常数,可能是因为vtk的头文件函数缺少或者依赖问题
#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2
actor->GetMapper ()->ImmediateModeRenderingOn ();
#endif
目测这个是用来检测OPENGL版本的,版本过低的话函数可能不匹配需要预处理
解决方法
我解决的是直接的找到VTK_RENDERING_BACKEND_OPENGL_VERSION的源代码位置,然后给他一个常量值,只要不影响项目运行就好。
这个问题也很魔幻,不知道是不是环境没配好,同一台机器这个项目没问题,另外一个项目又有问题。。。
编译出错,出现无法解析的外部符号
错误
error LNK2019: 无法解析的外部符号 “void __cdeclvtkRenderingOpenGL_AutoInit_Construct(void)”(?vtkRenderingOpenGL_AutoInit_Construct@@YAXXZ),该符号在函数 “public: __thiscallvtkRenderingOpenGL_ModuleInit::vtkRenderingOpenGL_ModuleInit(void)”(??0vtkRenderingOpenGL_ModuleInit@@QAE@XZ) 中被引用
error LNK2019: 无法解析的外部符号 “void __cdeclvtkRenderingOpenGL_AutoInit_Destruct(void)”(?vtkRenderingOpenGL_AutoInit_Destruct@@YAXXZ),该符号在函数 “public: __thiscall vtkRenderingOpenGL_ModuleInit::~vtkRenderingOpenGL_ModuleInit(void)”(??1vtkRenderingOpenGL_ModuleInit@@QAE@XZ) 中被引用
类似的很多,原本有四十多个,后来只剩和VTK相关的三个
原因
另外40多个是依赖的原因,vtk应该是头文件和版本的原因(猜的)
解决方法
我把lib和dll文件依赖重新设置一遍后基本上就剩下vtk引用出错了。
首先添加头文件引用
#include <vtkAutoInit.h>
然后在下面代码后面加个2:
VTK_MODULE_INIT(vtkRenderingOpenGL);//修改前
VTK_MODULE_INIT(vtkRenderingOpenGL2);//修改后
然后我就没问题了。
还是出错可以加上:
VTK_MODULE_INIT(vtkInteractionStyle) ;
VTK_MODULE_INIT(vtkRenderingFreeType);
我也不知道干啥用的…
过期事件函数
错误大概是这样
error LNK2019: 无法解析的外部符号 “afx_msg void OnBnClickedOk();”(?afx_msg void OnBnClickedOk();@@YAXXZ),该符号在函数 “afx_msg void OnBnClickedOk();”(??0vtkRenderingOpenGL_ModuleInit@@QAE@XZ) 中被引用
原因
MFC对话框中按组件被修改了(改了ID或者删除,等)
解决
看清楚是哪个事件函数,分析一下有没有用,有用就留下,没用删掉就行。