C++ Boost.Python : 2 проблемы

Итак, я ищу хороший инструмент для интеграции моего C++ кода с python, и сначала я посмотрел на boost.python.

Я получил hello examle из документации по boost и попытался собрать и запустить его. Исходный код (src/hello.cpp):

#include <Python.h>
#include <boost/python.hpp>

char const* greet()
{
   return "hello, world";
}

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

Проблема 1 - Windows и mingw

Я пытаюсь собрать и мой результат:

g++ -o build\hello.o -c -IE:\Programming\libs\boost_1_48_0 -IE:\Programming\Python\include src\hello.cpp
g++ -shared -o pyhello.dll build\hello.o -LE:\Programming\libs\boost_1_48_0\stage\lib -LE:\Programming\Python\libs -lboost_python-mgw45-mt-1_48 -lpython27 -Wl,--out-implib,libpyhello.a
Creating library file: libpyhello.a
build\hello.o:hello.cpp:(.text+0x20): undefined reference to `_imp___ZN5boost6python6detail11init_moduleEPKcPFvvE'

Также похожие 4 неопределенные ошибки с boost::python.

Моя командная строка build boost : bjam toolset=gcc variant=release

Я нашел похожие проблемы в google (и на stackoverflow тоже), но не нашел ответа в моем случае.

Проблема 2 - Использование модуля (linux)

На платформе linux у меня нет проблем со сборкой модуля, тот же исходник компилируется хорошо :

g++ -o build/hello.os -c -fPIC -I/usr/include/python2.7 src/hello.cpp
g++ -o libpyhello.so -shared build/hello.os -lboost_python -lpython2.7

Теперь, как я могу это использовать? В документации нет ни слова об именовании модуля, цитата :

можно использовать в Python, написав обертку Boost.Python:

#include 

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

Вот и все. Мы закончили. Теперь мы можем собрать это как разделяемую библиотеку. полученная DLL теперь видна в Python. Вот пример Python session:

>>> import hello_ext
>>> print hello_ext.greet()
привет, мир

Итак, мой модуль называется: libpyhello.so, но как я могу использовать его в итерпретаторе python? Я пробую импортировать pyhello, hello_ext, libpyhello - и только с libpyhello интерпретатор печатает :

ImportError: dynamic module does not define init function (initlibpyhello)

Все остальные варианты импорта провалились с : ImportError: No module named pyhello

UPDATE 2nd question : Решено, *.so модуль должен быть назван как ID, используемый в BOOST_PYTHON_MODULE. После изменения : BOOST_PYTHON_MODULE(hello_ext) на BOOST_PYTHON_MODULE(libpyhello), модуль импортируется как libpyhello.

6
задан Reddy 5 February 2013 в 18:05
поделиться