【问题标题】:Eigen and CImg compatibility issuesEigen 和 CImg 兼容性问题
【发布时间】:2014-03-14 09:28:57
【问题描述】:

所以,我正在尝试使用 CImg 记录和显示图像,但我也在使用一个名为 Eigen 的线性代数库。巧合的是,它们似乎都有一个同名的宏,“Success”。我试过做一个#undef,但结果并不顺利。所以每当我尝试编译时,我都会收到这个错误,即“成功”在不同的文件中定义了两次。我应该如何在不丢失任何宏的情况下删除此错误?非常感谢您的帮助!

【问题讨论】:

    标签: c++ graphics compiler-errors eigen cimg


    【解决方案1】:

    出现问题是因为 CImg 包含 X11 标头 X.h,其中定义了一个名为“Success”的宏。此宏与 Eigen 中的 ComputationInfo 枚举定义冲突,因为它有一个名为“Success”的枚举值。

    作为一种解决方法,您可以在包含 CImg 之后和包含 Eigen 之前取消定义“Success”:

    #include <CImg/CImg.h>
    #ifdef Success
      #undef Success
    #endif
    #include <eigen3/Eigen/Eigen>
    

    另见问题 #253 上 Eigen 的错误跟踪器: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,并在其前面加上 #undef Success。

      【讨论】:

        【解决方案3】:

        您可能还想在 CImg 中显示 X11 头文件的包含,方法是在包含 "CImg.h" 之前定义宏 cimg_display0(或在编译时放置 -Dcimg_display=0 标志)。 当然,仅当您不需要 CImg 的显示功能时才这样做。

        【讨论】:

          【解决方案4】:

          如果您的代码中不需要其中一个宏,您可以在两个包含之间使用#undef 它。所以,这真的取决于你在你的代码中需要什么。

          【讨论】:

          • 好吧,我需要将 Eigen 用于线性代数,并且我有一个包含 CImg.h 的类。这个特定的文件在编译时遇到问题并导致链接错误,说引用了一堆 _X 对象但方式不正确。我知道 CImg.h 导入 X11 文件(因为我在 Mac 上)所以我认为链接会起作用,但我对它为什么不起作用感到困惑。关于我现在为什么会出现链接错误的任何想法?
          猜你喜欢
          • 2016-05-25
          • 2013-12-11
          • 2013-01-25
          • 2011-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多