在新建一个新的 MFC 工程并单独添加 PCL 的时候,编译过程出现错误,提示 PCL 的相关文件中的 min 函数的输入参数个数不对,这其实是因为 windows 自己在 <window.h> 头中定义了宏 min 和 max 函数,而 PCL 中使用的 min 和 max 是 stl 中的函数,于是就产生了冲突,在网上找到一篇 microsoft 官方微博提供的关于此问题的一个解决方案:
http://support.microsoft.com/kb/143208
他的做法是在 Project->Properties->Configuration Properties->C/C++->Preprocessor->Preprocessor Definitions 中添加一个 NOMINMAX 的宏定义,这样的话 windows 自己的宏 min max 函数就不会被定义了,但是这样的做法是导致 MFC 中自己包含的很多确实用到该宏 min max 函数的地方报错,提示 min max 函数没定义,到此该问题的解决貌似成了一个鱼和熊掌不可兼得的情况。
回到 PCL 用户论坛继续找解决方案,最终找到一个方案,那就是在 stdafx.h 添加完所有 windows 自己头文件后,添加任何 PCL 头文件之前,通过 #undef 宏命令取消 windows 自己宏 min max 函数的定义:
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
// turns off MFC's hiding of some common and often safely ignored warning messages
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h> // MFC support for ribbons and control bars
#undef max
#undef min
#include <pcl/point_types.h>
#include <pcl/io/io.h>
这样的话所有的 windows 头还是用自己定义的 min max 函数,而所有 pcl 的库就用的 stl 的 min max 函数,这样做是合理的,因为 pcl 中肯定不会用到 windows 定义的 min max 函数。
没有评论:
发表评论