Segfault使用Boost Python进行清理

时间:2015-12-15 00:23:12

标签: python c++ python-3.x boost boost-python

我试图用一些简单的例子来使用libboost-python3将C ++结构传递给Python。该功能按预期工作,但在退出时会出现段错误。

我已将其提炼为最简单的示例,并且在解除分配创建的对象时仍然会出现段错误。

/* boost_python_exemplar.cpp: */

#include <boost/python.hpp>

struct Test_Struct
{
  int a;
};

BOOST_PYTHON_MODULE(libboost_python_exemplar)
{
  using namespace boost::python;

  class_<Test_Struct>("Test_Struct")
    .def_readwrite("a", &Test_Struct::a);
}

然后是随附的python代码:

# test.py

import libboost_python_exemplar
d = libboost_python_exemplar.Test_Struct()
# Segfault occurs here when the import is being cleaned up

我是否需要使用引用计数或是否必须执行明确的清理步骤?我正在努力找到这个例子的任何错误,因为它很简单。

附带的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.3)
project(Boost_Python_Exemplar)

SET(Boost_INCLUDE_DIR /usr/local/boost/1.55.0/include/)
SET(Boost_LIBRARY_DIR /usr/local/boost/1.55.0/lib64/)
FIND_PACKAGE(Boost 1.55)
IF(Boost_FOUND)
  INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}" "/usr/local/anaconda_py3/include/python3.4m/")
  SET(Boost_USE_STATIC_LIBS_OFF)
  SET(Boost_USE_MULTITHREADED ON)
  SET(Boost_USE_STATIC_RUNTIME OFF)
  FIND_PACKAGE(Boost 1.55 COMPONENTS python3 REQUIRED)

  ADD_LIBRARY(boost_python_exemplar SHARED boost_python_exemplar.cpp)
  TARGET_LINK_LIBRARIES(boost_python_exemplar ${Boost_LIBRARIES})
ELSE()
  MESSAGE(FATAL_ERROR "Unable to find correct Boost version.")
ENDIF()

IF(CMAKE_COMPILER_IS_GNUCXX)
  ADD_DEFINITIONS("-Wall" "-pedantic" "-g")
ELSE()
  MESSAGE(FATAL_ERROR "CMakeLists.txt requires GCC")
ENDIF()

1 个答案:

答案 0 :(得分:3)

Here有人得到了同样的错误。他正在使用带有g ++编译器的ld链接器。使用g ++链接器解决了他的问题。 您应该在CMakeFiles / boost_python_exemplar.dir / link.txt中检查链接器。