Ошибка импорта в программе приветствия python

включают

using namespace boost::python;

struct World{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};

BOOST_PYTHON_MODULE(hello)
{
    class_<World>("World")
        .def("greet", &World::greet)
        .def("set", &World::set)
    ;
}

Компилируй и собирай нормально

~/boost$ g++ -fPIC -I/usr/include/python2.6 -c hello.cpp 
~/boost$ g++ -shared hello.o -o hello.so

Но при импорте со стороны Python выдается ошибка.

>>> import hello.so
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./hello.so: undefined symbol: _ZNK5boost6python7objects21py_function_impl_base9max_arityEv
>>> 

Ответы

Ответ 1

Решено это через "Нет такого файла или каталога" с помощью Boost Python

g++ -c -fPIC hello.cpp -o hello.o
g++ -shared -Wl,-soname,hello.so -o hello.so  hello.o -lpython2.6 -lboost_python

сделал трюк для меня. Я надеюсь, что это будет настолько ясно, насколько это возможно, поскольку я боролся с этим примерно полчаса;)

Ответ 3

то же, что и другое сообщение здесь

g++ -c -fPIC hello.cpp -o hello.o
g++ -shared -Wl,-soname,hello.so -o hello.so  hello.o -lpython2.6 -lboost_python

Но я хочу подчеркнуть важность положения "-lpython2.6 -lboost_python". Если вы поместите их перед входными файлами (hello.o), они будут как-то проигнорированы (не связаны с окончательным hello.so). Это, по крайней мере, верно для g++ (Ubuntu/Linaro 4.6.3-1ubuntu5).

Чтобы быть простым, http://ubuntuforums.org/showthread.php?t=496287:

  g++ <.cpp or .o file(s)> [LDFLAGS] [LIBS] -o [appname]

Ответ 4

У меня была такая же проблема, и оказалось, что у меня отсутствует конструктор в моем классе.