Eigen和CImg的兼容性问题

4

我正在尝试使用CImg记录和显示图像,但同时我也在使用一个名为Eigen的线性代数库。巧合的是,它们似乎都有一个名称相同的宏“Success”。我已经尝试过#Undef,但这并不顺利。因此,每当我尝试编译时,都会出现错误,指出“Success”在不同的文件中被定义了两次。那么,我该如何消除这个错误,而不会失去任何宏?非常感谢您的帮助!

4个回答

3
问题出现是因为CImg包含X11头文件X.h,其中定义了一个名为“Success”的宏。这个宏与Eigen中的ComputationInfo枚举定义发生冲突,因为它有一个名为“Success”的枚举值。
解决方法是,在包含CImg之后、包含Eigen之前取消定义“Success”:
#include <CImg/CImg.h>
#ifdef Success
  #undef Success
#endif
#include <eigen3/Eigen/Eigen>

请参考Eigen故障跟踪器上的问题#253:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=253

2

无论是Eigen还是CImg都没有这样的# define。然而,Eigen在Eigen命名空间中有这样的枚举,因此问题更可能来自X11 X.h头文件,它# define Success。

因此,如果您需要使用来自X11的Success,请在X11之前包含Eigen的头文件(或包含它的任何人)。

如果您需要使用Eigen中的Success,请在包含Eigen之前#define Success。


1

您可能也希望在CImg中显示X11头文件的包含内容,方法是在包含"CImg.h"之前将宏cimg_display定义为0(或者在编译时加上-Dcimg_display=0标志)。当然,只有在您不需要CImg的显示功能时才这样做。


0
如果你的代码中不需要其中一个宏,你可以在两个包含文件之间使用#undef取消定义它。因此,这真的取决于你在代码中需要什么。

我需要使用Eigen进行线性代数计算,而我的一个类包含CImg.h。这个特定的文件编译时出现问题,并导致链接错误,说一堆_X对象被引用但不正确。我知道CImg.h导入了X11文件(因为我在Mac上),所以我认为链接应该可以工作,但我不明白为什么它不行。你有任何关于为什么我现在会得到链接错误的想法吗? - user2196118

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接