Tak więc, szukam dobrego narzędzia do integracji mojego kodu C++ z pythonem i na początku przyjrzałem się boost.python.C++ Boost.Python: 2 problemy
Otrzymałem hello z dokumentacji doładowania i próbowałem go zbudować i uruchomić. Kod źródłowy jest (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);
}
Problem 1 - Windows i MinGW
Staram się budować i mój wynik:
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'
podobne 4 błędy niezdefiniowane z boost :: python.
Moje doładowania budowa linii komend: bjam toolset=gcc variant=release
znalazłem podobne problemy w Google (i na stackoverflow też), ale nie znaleziono odpowiedzi w moim przypadku.
Problem 2 - Korzystanie z modułu (Linux)
Na platformie Linux nie mam problemu z modułu budynku, samo źródło skompilowany dobrze:
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
Teraz, w jaki sposób można korzystać z tego? W dokumentacji nie ma słowa o module nazewnictwa, cytuję:
może być narażony na Pythonie pisząc owijkę Boost.Python:
#include <boost/python.hpp> BOOST_PYTHON_MODULE(hello_ext) { using namespace boost::python; def("greet", greet); }
to wszystko. Skończyliśmy. Możemy teraz zbudować to jako wspólną bibliotekę. Utworzona biblioteka DLL w wersji jest teraz widoczna dla języka Python. Oto próbka Python sesja:
>>> import hello_ext >>> print hello_ext.greet() hello, world
Tak, mój moduł o nazwie: libpyhello.so, ale jak mogę go używać w Pythonie iterpreter? Staram pyhello import, hello_ext, libpyhello - i tylko z libpyhello interpreter jest wydrukowane:
ImportError: dynamic module does not define init function (initlibpyhello)
Wszystkie inne warianty importu nie powiodło się: ImportError: No module named pyhello
UPDATE 2-ty pytanie: rozwiązany * .so moduł musi być nazwany jako identyfikator używany w BOOST_PYTHON_MODULE. Po zmianie: BOOST_PYTHON_MODULE(hello_ext)
na BOOST_PYTHON_MODULE(libpyhello)
, moduł jest importowany również jako libpyhello.
Powinieneś sam odpowiedzieć i zaakceptować własną odpowiedź. – moooeeeep