使用 activemq 和 时编译错误



在我的 ubuntu 系统上,我编写了使用 activemq-cpp 3.6.0 和 mman.h 的代码,并且有一个棘手的编译错误。

我写了一个非常简单的代码来验证这个问题:

  #include <sys/mman.h>
  #include <activemq/core/ActiveMQConnection.h>
  int main(int argc, char** argv)
  {
      return 0;
  }

这是编译错误消息:

g++ -c -O2 -D_INTEL686 -D_LINUX -I. -I.. -I/home/matt/devspace/trading-apps/../trading-dependency/activemq-cpp/include/activemq-cpp-3.6.0 -I/home/matt/devspace/trading-apps/../trading-dependency/apr/include/apr-1  mqtest.cpp -o mqtest.o
In file included from /usr/include/x86_64-linux-gnu/sys/mman.h:41:0,
                 from mqtest.cpp:2:
/home/matt/devspace/trading-apps/../trading-dependency/activemq-cpp/include/activemq-cpp-3.6.0/activemq/util/PrimitiveValueNode.h:56:13: error: expected identifier before numeric constant
             MAP_TYPE           = 11, 

如果我把"mman.h"放在"activemq/core/ActiveMQConnection.h"之后,那就没问题了。有人有同样的问题吗?

====

==更新 2015/1/7==

===================================================

我对这个问题有进一步的调查。在"bits/mmap.h"中:

# define MAP_TYPE   0x0f        /* Mask for type of mapping.  */ 

在"activemq/util/PrimitiveValueNode.h"中:

enum PrimitiveType {
    ...,
    MAP_TYPE           = 11,
    ...
}

这是冲突。因此,"PrimitiveValueNode.h"必须包含在"mman.h"之前。

我认为这是说明为什么我们不应该在 C/C++ 代码中使用 #define 的典型场景。

这很可能与某些定义或全局声明的冲突有关。如果在 mman.h 中定义了某些内容,并且稍后在第二个标头中使用相同的字符串/名称,则可能会导致此类错误。更改包含的顺序会有所帮助,因为编译单元的构建方式 - 有问题的定义在后面。我多次遇到这样的情况,但标题不同。

最新更新