2012-02-04 1 views
6

그래서 저는 C++ 코드를 파이썬과 통합하기 위해 좋은 도구를 찾고, 처음에는 boost.python을 보았습니다.C++ Boost.Python : 2 문제

나는 boost 문서에서 hello를 얻었고 빌드하고 실행하려고 시도했다.

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 정의되지 않은 오류 : - Windows와와 Mingw

내가 빌드하려고 내 결과

#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 : 소스 코드 (SRC/아래 hello.c)입니다 boost :: python으로.

내 빌드 부스트 명령 행 : bjam toolset=gcc variant=release

나는 구글 (그리고 유래 너무)에 유사한 문제를 찾았지만, 내 경우에서 해답을 발견하지 않았다.

문제 2 - 난 건물 모듈 아무 문제도 없어 리눅스 플랫폼에서 모듈 (리눅스)

를 사용하여, 동일한 소스는 잘 컴파일 : 이제

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 

, 내가 그 방법을 사용할 수 있습니다

? 문서에 모듈 이름, 인용에 대한 아무 단어 :

가 Boost.Python 래퍼를 작성하여 파이썬에 노출 될 수 있습니다 다야

#include <boost/python.hpp> 

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

. 다 끝났어. 이제 이것을 공유 라이브러리로 만들 수 있습니다. 결과적으로 DLL이 파이썬에서 볼 수 있습니다.

>>> import hello_ext 
>>> print hello_ext.greet() 
hello, world 

그래서, 내 모듈 이름 : 다음은 샘플 파이썬 세션의 libpyhello.so하지만, 내가 어떻게 파이썬 iterpreter에서 사용할 수 있습니까? 나는, 수입 pyhello, hello_ext을 시도 libpyhello - 만에 libpyhello 인터프리터가 인쇄됩니다 : ImportError: No module named pyhello

UPDATE가 2 질문 : 해결, * .so를 모듈은 반드시 수입의

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

다른 모든 변종에 실패 BOOST_PYTHON_MODULE에 사용 된 ID로 명명됩니다. 내가 변경 한 후에 : BOOST_PYTHON_MODULE(hello_ext)에서 BOOST_PYTHON_MODULE(libpyhello)으로 모듈을 libpyhello로 잘 가져옵니다.

+0

당신은 스스로 대답하고 자신의 대답을 받아 들여야합니다. – moooeeeep

답변

3

안녕하세요, win7 32bitmingw과 같은 문제가 있습니다. 그렇지만 마지막으로 수정했습니다.

가능한 솔루션입니다 : lib 디렉토리 부스트 파이썬을 빌드 할 때, 링크 = 대신 공유를 사용

.

같은 : 링크의 BOOST_PYTHON_STATIC_LIB 매크로를 사용할 때

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

명시 적으로

것은 다음은 샘플을이다 cmd를 라인 :

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

시간을 절약하기 위해, 단지 추가 파일의 일부 줄 boost\python.hpp :

,210
#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 ... 

그런 다음, 당신은 단순히 같은 CMD 를 사용할 수 있습니다

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

이 쉘이 확인 될 것입니다, 시도가있다.

4

여기에 모듈 선언처럼 라이브러리 파일 이름을 지정하는 것이 중요 : hello_ext.dll 또는 hello_ext.so입니다

BOOST_PYTHON_MODULE(hello_ext) 

합니다.

+0

이것이 내 문제 였고, .so 접두어가'_'이고 내 BOOST_PYTHON_MODULE 호출이 아니 었습니다. 감사! –

+0

나는 libname과 같은 모듈 이름을 가지고 있어도 문제를 해결할 수 없다는 것과 같은 문제 만있다. 다른 아이디어? lib에서 nm을 실행했을 때, 그 안의 많은 심볼을 볼 수 없었습니다. 아마도 파이썬은 모든 것이 링크되어야합니다. –

+0

@MaxShifrin 어쩌면 다른 질문을 게시해야 할 수도 있습니다. 그럴 경우 여기서 주어진 대답이 왜 작동하지 않거나 귀하의 문제에 적용되는지에 대한 세부 정보를 추가하십시오. – moooeeeep