Visual Studio在Debug模式下,MFC工程中包含Eigen库时的定义冲突的问题
报错信息
Eigen\src\Core\PlainObjectBase.h(143,5): error C2061: 语法错误: 标识符“THIS_FILE”
Eigen\src\Core\PlainObjectBase.h(143,1): error C2333: “Eigen::PlainObjectBase::operator new”: 函数声明中有错误;跳过函数体
Eigen\src\Core\CwiseNullaryOp.h(341,27): error C2039: “setConstant”: 不是 “Eigen::PlainObjectBase” 的成员
以上仅仅列举了一部分报错信息。当Visual Studio编译报错时,不要看“错误列表窗口”,而要看“输出”窗口。在输出窗口中搜索“error”,找到第一个报错信息的位置,能最快找出错误原因。
如下图所示:
解决方法
根据报错信息,"THIS_FILE
"是MFC在debug
模式下启用的一个宏,方便调试时确定内存泄漏位置,看来报错信息与它有关。
与THIS_FILE
一同定义的宏还包括DEBUG_NEW
等。猜想是DEBUG_NEW
重载了new
运算符,而Eigen中也重载了new
运算符,在DEBUG_NEW
后包含Eigen就会导致new
定义不清的错误。
所以尝试将Eigen的包含位置放到DEBUG_NEW
定义之前。具体而言,找到包含Eigen的代码中的DEBUG_NEW
宏定义位置,如下所示:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
将包含语句放在该代码段之前即可。如果不需要检测内存泄漏,也可以直接删去这段代码。
如果在其他地方遇到此类问题,解决方法无外乎调整Eigen的包含位置,在包含其他各类库之前包含它。例如,在包含boost
相关头文件之前包含Eigen/Core
。