Ответ 1
Имя, используемое в BOOST_PYTHON_MODULE
, должно совпадать с именем библиотеки .so
, которую вы создаете, и импортировать в python.
Во-первых: я рассмотрел связанные вопросы, но они не очень полезны, к сожалению. Я пытаюсь обернуть enum и класс из внешней библиотеки.
#include <Python.h>
#include <boost/python.hpp>
using namespace boost::python;
#include <libvpsc/rectangle.h>
using vpsc::Rectangle;
using vpsc::Dim;
BOOST_PYTHON_MODULE(adaptagrams)
{
enum_<Dim>("dim")
.value("x", vpsc::XDIM)
.value("y", vpsc::YDIM)
.value("unset", vpsc::UNSET)
;
class_<Rectangle>("Rectangle",
init<double, double, double, double, optional<bool> >())
.add_property("centerX", &Rectangle::getCentreX)
.add_property("centerY", &Rectangle::getCentreY)
.add_property("width", &Rectangle::width, &Rectangle::set_width)
.add_property("height", &Rectangle::height, &Rectangle::set_height)
;
}
и скомпилируйте с помощью:
g++ -fPIC -I/usr/include/python2.7 -c adaptagrams.cpp -o adaptagrams.o
g++ -shared -Wl,-soname,adaptagrams.so -o adaptagrams.so adaptagrams.o -lpython2.7 -lboost_python -lvpsc
Однако, когда я пытаюсь импортировать модуль .so, я получаю сообщение об ошибке:
ImportError: dynamic module does not define init function (PyInit_adaptagrams)
Любые идеи?
Обновление: Когда я перезапускаю Python и пытаюсь импортировать, первая ошибка, которую я получаю:
ImportError: ./adaptagrams.so: undefined symbol: _ZN8topology13computeStressERKSt6vectorIPNS_4EdgeESaIS2_EE
Когда я повторю попытку, второй - это динамический импорт сверху (2.7) и segfault (3.2). Boost скомпилирован как против 2.7, так и 3.2, и я привязываю правильные для каждого подхода.
Обновление 2: Код учебника на странице boost_python работает:
#include <Python.h>
#include <boost/python.hpp>
using namespace boost::python;
struct Hello
{
Hello(std::string msg): msg(msg) {}
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
BOOST_PYTHON_MODULE(constructor)
{
class_<Hello>("Hello", init<std::string>())
.def("greet", &Hello::greet)
.def("set", &Hello::set)
;
}
То же компиляция:
g++ -fPIC -I/usr/include/python2.7 -c constructor.cpp -o constructor.o
g++ -shared -Wl,-soname,constructor.so -o constructor.so constructor.o -lpython2.7 -lboost_python
Имя, используемое в BOOST_PYTHON_MODULE
, должно совпадать с именем библиотеки .so
, которую вы создаете, и импортировать в python.
Я видел это исключение раньше. Я получил его с помощью Visual Studio на окнах, поэтому на unix-oid могут быть немного разные, но:
Две возможности:
Отладка/выпуск пропущенных совпадений:
Вы пытаетесь импортировать отладочную сборку своего модуля в сборку релиза python (или наоборот). Решение состоит в том, чтобы включить boost/python/detail/wrap_python.hpp
вместо Python.h
. Это позволит исправить некоторые из них и определяет, чтобы сделать то, что вы хотите.
Ошибка прошивки версии Python/Boost.Python: Boost.Python скомпилирован против одной конкретной версии python. Вы используете его с другой версией. Например: вы, кажется, используете python 2.7. Ваша библиотека boost_python может быть скомпилирована против python 2.6. Да, это означает, что ваш модуль может работать только с одной версией python за раз.