2010-01-07 3 views
11

저는 Boost Python 라이브러리를 사용하여 C++ 코드의 파이썬 확장을 만듭니다. 나는 파이썬에서 C++ 코드에서 '인사'기능을 호출 할 수, 아래에서 확인하실 수 있습니다 싶습니다building Visual Studio 2008을 사용하여 파이썬 예제를 개선합니다.

#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 

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

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

그리고 파이썬 코드 :

import hello_ext 
print hello_ext.greet() 

내가 사용이 작업을 수행하기 위해 관리했습니다 bjam (hello_ext.pyd가 생성되고 멋지게 작동합니다.)하지만 Visual Studio 2008을 사용하여 빌드하고 싶습니다. hello.dll이 빌드됩니다 (hello_ext.dll이나 .pyd도 생성되지 않습니다). 내 파이썬 코드를 호출 한 후 오류가 발생합니다.

ImportError : hello_ext라는 모듈이 없습니다.

hello.pyd 또는 hello_ext.pyd하는 hello.dll 이름을 바꾼 후, 나는 또 다른 ImportError를 얻을 : DLL이로드가

가 어떻게 VS 2008를 사용하여 올바른으로 .pyd 파일을 구축 할 수 있습니다 실패?

+0

참조 http://stackoverflow.com/questions/2003506/how-to-build-a-boost-dependent-project-using- regularular-makefiles/2055958#2055958 – rafak

답변

0

-lpython26 (python2.6을 사용하는 경우) 플래그가 있는지 확인하고 파일 이름은 hello_ext.pyd이어야합니다.

10

먼저 파이썬에서 릴리스 버전 만 가져 오기를 시도하십시오. 런타임 라이브러리 버전이 일치하지 않으므로 디버그 버전 가져 오기가 실패합니다.

등록 >> 링커 >> 출력 :

$(OutDir)\$(ProjectName).pyd 

(I도에서 단위 테스트를 실행하는 빌드 후 작업을 만들 릴리스 버전은으로 .pyd 파일을 출력되도록 나는 또한 내 프로젝트 속성을 변경 파이썬)

다음, 당신은 당신의 STDAFX.H 파일에 다음을 정의해야합니다 : 둘 이상의 파이썬 버전이 설치되어있는 경우,

#define BOOST_PYTHON_STATIC_LIB 

마지막으로 내가이야 있는지 확인 (Tools >> Options >> Projects and Solutions >> VC++ Directories >> Include Files에서) 올바른 버전의 python.h를 다운로드하십시오.

5

오류 ImportError를 : - 자주 MSVC * .DLL DLL이로드가 실패는 일반적으로 .pyd 모듈을 찾을 수 없습니다 다른 DLL에 의존한다는 것을 의미한다. 메모장에서 .pyd 파일을 열고 ".dll"을 검색하려고 할 수 있습니다. 그런 다음 모든 DLL 종속성이 디렉토리 또는 PATH에 있는지 확인하십시오. 누락 종속성을 찾을 수

또는 사용 Dependency Walker 당신이 몇 년 전에 발행 된 질문은 (여전히 쉬운 솔루션을 찾을 수 없습니다)입니다,하지만 난 시간이 검색 한 후 오늘 같은 문제를 충족하고 있지만

1

, 마침내 가능한 해결책을 찾았습니다. @AndiDog에 의해 발견되는대로

  • 이유는 단지 간단합니다, 당신이 구축 으로 .pyd 파일에 따라 다른 .DLL;
  • 제 경우에는 boost_python-vc120-mt-1_58입니다.폴더 [C++ 부스트 폴더]에서 DLL/무대/lib 디렉토리/
  • 그럼, 내가 할 것은 으로 .pyd 파일 폴더에서이 파일을 복사하고 붙여 넣기하는 것입니다, 그리고 내 파이썬 제대로 할 수 내가 만든 프로젝트를 가져 오십시오.

  • 어쩌면 거기에 정적 라이브러리를 대신 동적 라이브러리에 의존하지 않는 프로젝트를 빌드하는 다른 해결책이 있습니다. 일부 소스의 경우 VS 프리 프로세서에 BOOST_PYTHON_STATIC_LIB을 정의한 다음 프로젝트가 동적 라이브러리 (새 C++ 어입니다)에 의존하지 않지만 빌드가 인지 확인하십시오. libboost_python-vcXXX-mt-1_58.dll 부스트 중 처리기를 정의하는

  • 이 경로는 다음과 같습니다 C/C++ - 메이크 (및 GCC)와 같은 프로젝트를 빌드에 관심있는 사람들을 위해> Preprocessor-> 전 처리기 정의 -> 편집 BOOST_PYTHON_STATIC_LIB
관련 문제