C/C++과 python은 비교적 쉽게(?) 연동할 수 있다. 다양한 방법이 있지만, 오늘은 Boost Python을 사용하여 언어간 연동을 해보도록 하겠다. 사용한 환경은 아래와 같다.
python과 Boost는 아래와 같이 폴더에 위치해 있으며, 이는 각자 개발환경 마다 다를 것이므로 참고만 하자. 환경변수에 추가할 필요는 없다!
- WinPython : %PYTHON_HOME% = D:\Development\WinPython-64bit-3.3.5.0
- Boost 1.55 : %BOOST_HOME% = D:\Development\boost_1_55_0
1. Boost 빌드
보통 Boost의 경우 hpp만 사용하면 굳이 빌드할 필요가 없으나, 특정 모듈의 경우는 라이브러리를 빌드해야 한다. 나의 목표인 Boost python은 빌드를 해주어야 한다.
1.1. Visual Studio 2013 Development Shell을 수행
메뉴 -> Visual Studio 2013 -> Visual Studio Tools 을 누르면 아래와 같은 창을 확인할 수 있다.
"VS2013 x64 Cross Tools 명령 프롬프트" 를 실행하고, Boost 1.55가 압축해제된 폴더로 이동한다.
1.2. Bootstrap 실행
bootstrap.bat 를 실행한다.
b2.exe와 project-config.jam 파일이 생성된 것을 확인할 수 있다.
1.3. project-config.jam 수정
※ ; 문자 전에 반드시 공백이 있어야한다!
Boost Python에 관련된 설정을 아래와 같이 추가해 준다.
using python : 3.3 : D:\\Development\\WinPython-64bit-3.3.5.0\\python-3.3.5.amd64\\python : : : <address-model>64 ;
1.4. b2 커맨드 실행하여 Boost 빌드
※ -j# 커맨드를 추가하면, #의 숫자만큼 동시 빌드를 할 수 있다.
b2 커맨드를 아래와 같이 수행한다.
b2 -j4 --toolset=msvc-12.0 --build-type=complete architecture=x86 address-model=64 stage
열심히 빌드를 하고있다.
최종적으로 빌드가 완료되었다. (몇몇 패키지는 python이랑 같이 빌드시 실패한다고 한다.)
1.5. Boost Python 라이브러리 생성 확인
%BOOST_HOME%\stage\lib 에서 확인할 수 있다.
2. Visual Studio 프로젝트 생성
Boost Python이 준비되었으므로, 이제 C++ 프로젝트를 만들어 Python과 연동해본다.
2.1. Project 생성
Visual Studio 2013 Express 를 구동한다. 메뉴 -> 파일 -> 새 프로젝트 를 선택한다.
Visual C++ -> Win32를 선택하고, "Win32 콘솔 응용 프로그램" 을 선택한다. Python에서 import에 사용할 모듈 이름을 넣는다. 예제에서는 "PythonModuleTest" 를 사용하였다.
Win32 응용 프로그램 마법사에서, 아래와 같이 응용 프로그램 종류는 "DLL"로, 추가 옵션은 "빈 프로젝트" 를 선택하고 마침 버튼을 눌러 프로젝트 생성을 완료한다.
2.2. Project 파일 추가
HelloWorld라는 클래스를 만든다. 간단히 string을 멤버 변수로 가지고 있으며, 멤버 변수의 getter / setter와 문자열을 출력하는 함수로 구성되어 있다. 첨부된 파일들을 참고한다.
Python Wrapper 소스코드에 대한 설명은 링크를 참고한다.
2.3. Project 설정
1) 최초 설정이 DLL로 되어있다. 대상 확장명을 ".dll" 에서 ".pyd" 로 수정한다.
2) 헤더 설정 : 프로젝트 설정 -> C/C++ -> 일반 -> 추가 포함 디렉터리에 아래 디렉터리를 추가한다.
- %PYTHON_HOME%\python-3.3.5.amd64\include : Ex) D:\Development\WinPython-64bit-3.3.5.0\python-3.3.5.amd64\include
- %BOOST_HOME% : Ex) D:\Development\boost_1_55_0
3) 링커 설정 : 프로젝트 설정 -> 링커 -> 일반 -> 추가 라이브러리 디렉터리에 아래 디렉터리를 추가한다.
- %PYTHON_HOME%\\python-3.3.5.amd64\libs : Ex) D:\Development\WinPython-64bit-3.3.5.0\python-3.3.5.amd64\libs
- %BOOST_HOME%\stage\lib : Ex) D:\Development\boost_1_55_0\stage\lib
2.4. Project 빌드
설정이 완료되었다. 이제 빌드하여, PythonModuleTest.pyd 가 생겼음을 확인해 본다.
※ x64 환경으로 진행하였다. x64 환경은 메뉴 -> 빌드 -> 구성 관리자 -> <새로 만들기> -> x64를 하면 64bit로 빌드할 수 있다.
3. Python 으로 확인
PythonModuleTest.pyd 가 생성되었으므로, python을 실행하여 제대로 import 되어 사용할 수 있는지 확인해본다.
3.1. boost_python.dll 이동
VIsual Studio 빌드 환경에 따라 다양한 Boost Python dll 들이 준비되어 있다. 본 예제에서는 boost_python-vc100-mt-gd-1_55.dll 를 사용한다. 해당 Boost Python DLL 파일을 PYTHONPATH에 포함된 디렉터리로 복사해도 되고, 생성된 pyd 위치에 복사해도 된다. 후자를 선택해 진행한다.
3.2. 실행
이제 PythonModuleTest.pyd가 위치한 디렉터리로 이동하여, python을 수행한다. C++ DLL 모듈이 Python에서 잘 로드되어 클래스를 활용할 수 있는 것을 확인할 수 있다.
dll을 못찾는 다면, "ImportError: DLL load failed: 지정된 모듈을 찾을 수 없습니다." 이란 오류를 보게될 것이다.
참고)
- http://stackoverflow.com/questions/2629421/how-to-use-boost-in-visual-studio-2010
- http://mmmovania.blogspot.kr/2013/01/running-c-code-from-python-using.html