C++ 包括 python.h 和 boost/python.hpp 导致 SEH 异常
C++ including python.h and boost/python.hpp causes SEH exception
我最近在尝试修复我正在使用的 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 包含解决了我的问题,但我一直无法找出导致异常的原因,我希望能够与我的同事分享为什么他们不应该这样做这个(过去它破坏代码的明显原因)
我应该具体一点,并指出代码在执行提取函数之前运行良好。
如果 Python.h
包含在 Boost.Python header 之前,则会发生宏冲突。例如,Python.h
包含 LongObject.h
定义 ULONGLONG_MAX
,这会混淆 Boost 的配置。 detail/prefix.hpp
:
中指出了包含问题
The rule is that <Python.h>
must be included before any system headers (so it can get control over some awful macros). Unfortunately, Boost.Python needs to #include <limits.h>
first, at least... but this gets us as close as possible.
经过一些设置工作后,detail/wrap_python.hpp
包括 Python.h
。
我最近在尝试修复我正在使用的 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 包含解决了我的问题,但我一直无法找出导致异常的原因,我希望能够与我的同事分享为什么他们不应该这样做这个(过去它破坏代码的明显原因)
我应该具体一点,并指出代码在执行提取函数之前运行良好。
如果 Python.h
包含在 Boost.Python header 之前,则会发生宏冲突。例如,Python.h
包含 LongObject.h
定义 ULONGLONG_MAX
,这会混淆 Boost 的配置。 detail/prefix.hpp
:
The rule is that
<Python.h>
must be included before any system headers (so it can get control over some awful macros). Unfortunately, Boost.Python needs to#include <limits.h>
first, at least... but this gets us as close as possible.
经过一些设置工作后,detail/wrap_python.hpp
包括 Python.h
。