包含python.h和boost / python.hpp的C ++导致SEH异常

时间:2015-02-06 15:47:28

标签: python c++ boost

我最近在尝试修复我正在研究的c ++软件中的python实现时偶然发现了一些问题。如果您包含以下内容:

#include <python.h>
#include <boost/python.hpp>

然后以下代码导致SEH异常,内存访问冲突:

boost::python::object mainModule;

Py_Initialize();

std::lock_guard<std::mutex> lg(PythonAccessMutex);
this->mainModule = boost::python::import("__main__");

boost::python::dict globalDict = boost::python::extract<boost::python::dict>(this->mainModule.attr("__dict__"));

删除python.h包括解决了我的问题,但是我一直无法找出导致异常的原因,并且我希望能够与我的同事分享为什么他们不应该这样做。这样做(过去明显的原因,它打破了代码)

我应该具体并指出代码运行正常,直到它到达提取函数。

1 个答案:

答案 0 :(得分:1)

如果在Boost.Python标头之前包含Python.h,则存在宏冲突。例如,Python.h包含定义LongObject.h的{​​{1}},它会混淆Boost的配置。包含问题在detail/prefix.hpp中注明:

  

规则是ULONGLONG_MAX必须包含在任何系统标头之前(因此它可以控制某些可怕的宏)。不幸的是,Boost.Python首先需要<Python.h>,至少......但这会让我们尽可能接近。

完成某些设置后,detail/wrap_python.hpp包含#include <limits.h>