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

C++ including python.h and boost/python.hpp causes SEH exception

本文关键字:python C++ 导致 异常 SEH boost 包含 hpp      更新时间:2023-10-16

我最近在尝试修复我正在开发的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 include解决了我的问题,但我一直无法找出导致异常的原因,我希望能够与我的同事分享他们为什么不应该这样做(除了破坏代码的明显原因)

我应该具体指出,代码运行良好,直到达到提取函数。

如果在Boost.Python标头之前包含Python.h,则存在宏冲突。例如,Python.h包括定义ULONGLONG_MAXLongObject.h,这混淆了Boost的配置。detail/prefix.hpp:中指出了包含问题

规则是<Python.h>必须包含在任何系统头之前(这样它就可以控制一些糟糕的宏)。不幸的是,Boost.Python首先需要#include <limits.h>,至少。。。但这让我们尽可能接近。

经过一些设置工作,detail/wrap_python.hpp包括Python.h