저는 파이썬에서 사용할 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.i
과 setup.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.cc
및 simple.h
는) here에서 그대로 사용된다.
그럼, 질문입니다. 누구든지이 오류를 해결하도록 안내 할 수 있습니까?
당신이는 MinGW와 파이썬 모두 32 비트 있음을 확인 했
extern "C"
을 사용하는 것입니다? –표준 mingw 설치 프로그램을 사용했는데 32 비트로 이해해야합니다. 인터넷 검색 중 일부는 mingw-64가 mingw32에서 분기되었으며, 확실히 포크를 설치하지 않았 음을 보여줍니다. 파이썬은 확실히 32 비트입니다. – cabraut