Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ImportError: /usr/lib/libboost_python.so.1.54.0: undefined symbol: PyClass_Type

I have code written in C++:

#include <boost/python.hpp>

char const* greet()
{
  return "Yay!";
}

BOOST_PYTHON_MODULE(libtest)
{
  using namespace boost::python;
  def("greet", greet);
} 

Now i want to import this dynamic library to python by:

import libtest

But I get:

ImportError: /usr/lib/libboost_python.so.1.54.0: undefined symbol: PyClass_Type

What should I do? My OS is Arch Linux.

like image 738
Yuras Avatar asked Nov 08 '13 18:11

Yuras


2 Answers

Ok, I have found solution for this problem. The simplest options is to compile by:

g++ testing.cpp -I/usr/include/python3.3m -I/usr/include/boost -lboost_python3 -lpython3.3m -o testing.so -shared -fPIC

Previously I used -lboost_python instead of -lboost_python3 ... But this solution is not cross platform so we can achieve this by cmake:

cmake_minimum_required(VERSION 2.6)


find_package(Boost 1.54 EXACT REQUIRED COMPONENTS python3)

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} "/usr/include/python3.3m/" )
find_package(PythonLibs)
ADD_LIBRARY(testing SHARED testing.cpp)
TARGET_LINK_LIBRARIES(testing ${Boost_LIBRARIES} ${PythonLibs_LIBRARIES})

Of course "/usr/include/python3.3m" won't be path to pythons include directory in all linux distros.

like image 198
Yuras Avatar answered Oct 15 '22 07:10

Yuras


Use the same version of Python when building both Boost.Python and the libtest module, as well as when importing libtest.

PyClass_Type is is part of the Python 2 C API and not part of the Python 3 C API. Hence, the Boost.Python library was likely built against Python 2. However, it is being loaded by a Python 3 interpreter, where the PyClass_Type is not available.

like image 23
Tanner Sansbury Avatar answered Oct 15 '22 06:10

Tanner Sansbury