本帖最后由 tyzaizl 于 2015-8-6 21:06 编辑
MFC结合PCL编程主要事项
1. fatal error LNK1104,cannot openmfc120d.lib。 解决方法:工程属性->C/C++->Command Line: Additional Option 添加 /D “_UNICODE”。 2. error C2589: '(' : illegal token on rightside of '::'以及C2988和C2059 解决方法:加括号
- minmax[0] = std::numeric_limits<double>::min ();
- minmax[1] = std::numeric_limits<double>::max ();
- 改为:
- minmax[0] = (std::numeric_limits<double>::min) ();
- minmax[1] = (std::numeric_limits<double>::max) ();
复制代码3. 3>E:\3DSource\VTK_5_10\VTK5.10.1\IO\vtkEnSightGoldBinaryReader.cxx(4055):error C2678: binary '==' : no operator found which takes a left-hand operand oftype 'std::basic_istream<char,std::char_traits<char>>' (or there isno acceptable conversion) 解决方法:if (this->IFile->read(dummy, 4) == 0)改成if (!this->IFile->read(dummy, 4)) 4. VTK_MACRO_OPERATER(OSTREAM&)的错误 解决方法,将vtkOstreamMapper.h和vtkOstreamMapper.cxx对应的声明和定义都注释掉。
5. 应用pcl_mfc_visualization.lib库完成MFC应用程序开发时,在利用picture control控件(该控件为CWnd类)生成pcl_visualizer窗口时,用vtkMFCWindow类初始化窗口,调用create函数时出现中断,具体函数如下:
- vtkMFCWindow::vtkMFCWindow(CWnd *pcWnd)
- {
- this->pvtkWin32OpenGLRW = NULL;
- // create self as a child of passed in parent
- DWORD style = WS_VISIBLE | WS_CLIPSIBLINGS;
- if(pcWnd)
- style |= WS_CHILD;
- BOOL bCreated = CWnd::Create(NULL, _T("VTK-MFC Window"),
- style, CRect(0, 0, 1, 1),
- pcWnd, (UINT)IDC_STATIC);
- SUCCEEDED(bCreated);
- // create a default vtk window
- vtkWin32OpenGLRenderWindow* win = vtkWin32OpenGLRenderWindow::New();
- this->SetRenderWindow(win);
- win->Delete();
- }
复制代码 错误如图1- file:afxwin1.inl
- line:21
- 发现是下面的断言语句报错:
- _AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
- {
- ASSERT(afxCurrentResourceHandle != NULL);//这里出错!
- return afxCurrentResourceHandle;
- }
复制代码解决方法 问题出现原因:vtkMFC.dll编译过程中字符集与工程编译过程中选择的字符集不一致。两者必须同为Multi-Byte或者UNICODE,Create()函数时传进去的窗口名的编码方式必须和其编译时一致。 5. pcl版本差异的不同
PCL 1.6 | | #include <sensor_msgs/PointCloud2.h> | #include <pcl/PCLPointCloud2.h> | pcl::fromROSMsg (cloud, cloud_xyz); | pcl::fromPCLPointCloud2(cloud, cloud_xyz); | sensor_msgs::PointCloud2 | |
|
|
6无法定位程序输入点,如图2
问题原因:环境混乱,多个pcl版本同时在环境变量中配置,而且应用程序首先找到的并不是你希望的版本。 解决方法:将想用的pcl版本路径在环境变量path中的位置放在其他pcl版本之前,或者修改其他版本文件夹名字,让系统找不到。 7. error C2661,error C2661: “operator new” … 解决方法:将下面的宏定义注释掉, //#ifdef _DEBUG //#define new DEBUG_NEW //#endif |
8. 定义了pcl中类似boost智能指针但使用前未初始化: pcl::PointCloud<pcl::PointXYZ>::Ptr pcd_4_update;//定义 pcd_4_update = pcl::PointCloud<pcl::PointXYZ>::Ptr (new pcl::PointCloud<pcl::PointXYZ>);//初始化 |
错误如图3
|