Итак, я ищу хороший инструмент для интеграции моего 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.