2016-07-11 6 views
3

저는 파이썬에서 사용할 C++ 확장을 컴파일 할 수 있도록 Windows 7에서 파이썬 2.7 환경을 설정하려고 시도해 왔습니다. 필자가이 책을 처음 접했을 때 간단한 예제 here을 다운로드하여 그대로 사용했습니다. 또한 경로에 numpy.i 파일이 있습니다. mingw (최신 버전) 및 swig (3.0.10 버전)로 컴퓨터를 설정했으며 Python 버전은 2.7.9입니다. 심지어 g ++를 사용하여 작은 C++ 프로그램을 컴파일 할 때이 환경을 사용해도 문제가 없습니다.SWIG, mingw32, distutils 문제

위에서 언급 한 "간단한"Python 확장 기능을 빌드 할 때 나는 아래의 첫 번째 줄에 Windows cmd.exe 창에서 발행 한 명령을 포함하여 실패를 나타내는 다음 출력을 항상 얻습니다.

python setup.py build -c=mingw32 
running build 
running build_ext 
building '_simple' extension 
swigging simple.i to simple_wrap.c 
C:\swigwin\swigwin-3.0.10\swig.exe -python -o simple_wrap.c simple.i 
C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python27\lib\site-packages\numpy\core\include -I. -IC:\Python27\include -IC:\Python27\PC -c simple.cc -o build\temp.win32-2.7\Release\simple.o 
C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python27\lib\sitepackages\numpy\core\include -I. -IC:\Python27\include -IC:\Python27\PC -c simple_wrap.c -o build\temp.win32-2.7\Release\simple_wrap.o 
writing build\temp.win32-2.7\Release\_simple.def 
C:\MinGW\bin\g++.exe -shared -s build\temp.win32-2.7\Release\simple.o build\temp.win32-2.7\Release\simple_wrap.o build\temp.win32-2.7\Release\_simple.def -LC:\Python27\libs -LC:\Python27\PCbuild -lpython27 -lmsvcr90 -o build\lib.win32-2.7\_simple.pyd 
build\temp.win32-2.7\Release\simple_wrap.o:simple_wrap.c:(.text+0xce5): undefined reference to `create_list' 
build\temp.win32-2.7\Release\simple_wrap.o:simple_wrap.c:(.text+0x170d): undefined reference to `dot' 
collect2.exe: error: ld returned 1 exit status 
error: command 'C:\\MinGW\\bin\\g++.exe' failed with exit status 1 

나는 여기 아주 간단한 뭔가를 누락 끔찍한 느낌이 있지만 성공적으로 문제없이 별도의 Cygwin 환경에서 이러한 동일한 파일을 컴파일 관리했습니다 (그리고 예, 그것은 나를 위해 바람직하다 Cygwin 환경이 아닌 경우이 작업을 수행 할 수 있습니다.

너무 많은 코드로이 질문을 질식시키고 싶지 않지만, 참고로 여기에 내가 사용하고있는 simple.isetup.py 파일이 있습니다. 다른 코드가 필요한 경우

simple.i: 
%module simple 
%{ 
    #define SWIG_FILE_WITH_INIT 
    #include "simple.h" 
%} 

%include "numpy.i" 
%init %{ 
import_array(); 
%} 

%apply (int DIM1, double* INPLACE_ARRAY1) {(int n0, double *a0)}; 
%apply (int DIM1, double* IN_ARRAY1) {(int n, double *a), (int m, double *b)}; 
%apply (int DIM1, double* ARGOUT_ARRAY1) {(int size, double *arr)}; 
%include "simple.h" 

setup.py: 
from distutils.core import setup, Extension 
import numpy 
import os 

os.environ['CC'] = 'g++'; 
setup(name='matt_simple_test', version='1.0', ext_modules =[Extension('_simple',['simple.cc', 'simple.i'], include_dirs = [numpy.get_include(),'.'])]) 

, 나는 그들을 게시 할 수 기쁘게 생각합니다, 그러나 다시, 다른 파일 (simple.ccsimple.h는) here에서 그대로 사용된다.

그럼, 질문입니다. 누구든지이 오류를 해결하도록 안내 할 수 있습니까?

+0

당신이는 MinGW와 파이썬 모두 32 비트 있음을 확인 했 extern "C"을 사용하는 것입니다? –

+0

표준 mingw 설치 프로그램을 사용했는데 32 비트로 이해해야합니다. 인터넷 검색 중 일부는 mingw-64가 mingw32에서 분기되었으며, 확실히 포크를 설치하지 않았 음을 보여줍니다. 파이썬은 확실히 32 비트입니다. – cabraut

답변

1

이 컴파일 단계에서 입력 파일은 C++ 코드로 컴파일되며 symbol.cc의 함수에는 C (이름 변경)와 호환되지 않는 기호가 제공됩니다.

C는 :는 MinGW \ 빈 \ gcc.exe -mdll -O -Wall -IC \ : \ Python27 \ lib 디렉토리의 \ 사이트 - 패키지 \ NumPy와 핵심 \ \ -I를 포함한다. -IC : \ Python27 \는 -IC을 포함한다 : \ Python27 \는 PC는 -c -o \ temp.win32-2.7 \ 릴리스 \이 컴파일에서

simple.o 입력 파일로 컴파일 스텝 빌드 simple.cc symbols.cc에있는 C 코드와 함수의 심볼은 다를 것으로 예상됩니다.

C는 :는 MinGW \ 빈 \ gcc.exe -mdll -O -Wall -IC \ : \ Python27 \ lib 디렉토리 \ sitepackages \ NumPy와 \ 코어 \는 -I를 포함한다. -IC : \ Python27 \는 -IC을 포함한다 : \ Python27 \ PC -c simple_wrap.c -o 구축 \ temp.win32-2.7 \ 릴리스 \ 문제를 해결하기 위해

한 가지 방법 simple_wrap.o swig_opts을 추가하는 것입니다

setup(name='matt_simple_test', version='1.0', 
     ext_modules=[Extension('_simple', ['simple.cc', 'simple.i'], 
        swig_opts=["-c++"], 
        include_dirs = [numpy.get_include(),'.'])]) 

또 다른 옵션은 simple.cc에

extern "C" double dot(int n, double *a, int m, double *b) 
... 
extern "C" void create_list(int size, double *arr) 
... 
+0

예, 'swig_opts'를 setup 명령에 추가하면 트릭을 수행했습니다! 많은 감사합니다! – cabraut