2012-02-04 11 views
6

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.

+0

Powinieneś sam odpowiedzieć i zaakceptować własną odpowiedź. – moooeeeep

Odpowiedz

3

Witam, mam ten sam problem co Twój pod numerem win7 32bit z mingw, jednak naprawiłem go w końcu.

Możliwe rozwiązanie:

Kiedy budować lib doładowania Pythona, użyj link = udostępniony zamiast.

jak:

bjam stage toolset=gcc --with-python link=shared threading=multi runtime-link=shared variant=release,debug --user-config=user-config.jam cxxflags="-include cmath " 

Kiedy link użyć makra BOOST_PYTHON_STATIC_LIB wyraźnie

Poniżej próbka cmd linia:

g++ hello_ext.cpp -shared -O3 -DBOOST_PYTHON_STATIC_LIB -lboost_python -lpython25 -o hello_ext.pyd 

Aby zaoszczędzić czas, po prostu dodaj niektóre wiersze w pliku boost\python.hpp:

#include <cmath> //fix cmath:1096:11: error: '::hypot' has not been declared 
#if defined(__MINGW32__) && defined(_WIN32) 
#if !defined(BOOST_PYTHON_SOURCE) 
#define BOOST_PYTHON_STATIC_LIB 
#endif 
#endif 
... here,other includes files ... 

Następnie można po prostu użyć cmd tak:

g++ hello_ext.cpp -shared -lboost_python -lpython25 -o hello_ext.pyd 

Ta powłoka będzie ok, mają szansę.

4

To ważne, że plik biblioteki nazywa się jak zadeklarować moduł tutaj:

BOOST_PYTHON_MODULE(hello_ext) 

który jest hello_ext.dll lub hello_ext.so.

+0

To był mój problem, mój .to był przedrostek z '_', a moje wywołanie BOOST_PYTHON_MODULE nie było. Dzięki! –

+0

Mam ten sam problem tylko, że posiadanie nazwy modułu takiej samej jak nazwa pliku nie rozwiązuje problemu. Jakieś inne pomysły? Kiedy uruchomiłem nm w bibliotece, nie widzę w nim wielu symboli, może pyton potrzebuje wszystkiego, żeby się połączyć? –

+0

@MaxShifrin Może musisz wtedy zadać kolejne pytanie. Jeśli tak, dodaj szczegóły, dlaczego podane tutaj odpowiedzi nie działają/nie dotyczą Twojego problemu. – moooeeeep

Powiązane problemy